Router na sumboduly Modul:Admin|Front:Presenter
- Jiří Nápravník
- Člen | 710
Jde nějak rozumně udělat univerzální routu, aby správně matchovala strukturu, v které mám moduly typu:
UserModule\AdminModule\UserPresenter.php
ForumModule\AdminModule\TopicPresenter.php
a chci mít adresy:
/admin/user/user
/admin/forum/topic
teď musím každou routu explicitně uvádět: tedy např.:
$forumList = new RouteList('Forum');
$forumList[] = $adminList = new NetteRouteListMock('Admin');
$adminList[] = new Route('/admin/forum/<presenter>/<action>[/<id>]', 'Topic:default');
Pak to funguje jak má, ale přece jen těch rout příbývá a a může to
časem přinášet problémy, když těch modulů bude více a více.
Případně jde to nějak vyřešit vlastním routerem?
- Jiří Nápravník
- Člen | 710
Tak jsem to nakonec vykoumal celkem snadno to jde přes filtry, pokdu by nekdo řešil to samé:
public static function filterIn($module)
{
return ucfirst($module) . ':Admin';
}
public static function filterOut($module)
{
list($module) = explode(':', $module);
return strtolower($module);
}
- Jiří Nápravník
- Člen | 710
Proměnná $module se tam dostane automaticky, protože když uděláš něco takového:
$route = new Route('<module>/<presenter>/<action>/<id>', array(
'module' => array(
Route::FILTER_IN => 'filterInFunc',
Route::FILTER_OUT => 'filterOutFunc',
),
'presenter' => 'homepage',
'action' => 'default',
'id' => NULL,
));
tak na těch dvou filter funkcích máš to <module> jako parametr.
- webdata
- Člen | 153
Dík jak blázen – tohle je faktu super a je to přesně to co jsem potřeboval takže můžu mít uplně pěkně, alespoň pro mne (nevím jak ostatní) rozdělenou aplikaci už jen ten základ modulu a presenteru je good. Teď to mám takto:
app
modules
PageModule
AdminModule
presenters
DefaultPresenter.php
EditPresenter.php
TrashPresenter.php
templates
models
DI
config
presenters
templates
components
UsersModule
AdminModule
presenters
templates
models
DI
config
presenters
templates
compontents
Ještě jednou dik. Pro mne je tato struktura přehledná a můžu s minimální úpravou vzít „modul“ a použít ho jinde.
- Jiří Nápravník
- Člen | 710
Rozdělení mám hodně podobně. Prostě jen ty front presentery apod. dám do dalšího podmodulu
Mám jen
app
PageModule
AdminModule
presenters
templates
FrontModule
presenters
templates
components
models
DI
Já tohle hledal dlouho a překvapilo mě, že to nikdo neřešil a přitom je to takhle jednoduchý:-)
- webdata
- Člen | 153
Mozna to ma jeste chybicku:
domena.tld/admin/pages/
- vola PagesModule/AdminModule/presenters/DefaultPresenter.php
domena.tld/admin/pages/edit/
- vola PagesModule/AdminModule/presenters/EditPresenter.php
domena.tld/admin/pages/edit/save/
- vola akci save v PagesModule/AdminModule/presenters/EditPresenter.php
Bohuzel tohle hodí ze neexistuje http požadavek
domena.tld/admin/pages/edit/25
- vola PagesModule/AdminModule/presenters/EditPresenter.php
A musi se volat
domena.tld/admin/pages/edit/defautl/25
- Jiří Nápravník
- Člen | 710
No je to celkem pochopitelný, protože jsi jednu tu část <action> vyhodil. Já používám default pro přehled, takže tam neřeší nějak id apod. A edit mám jako metodu v presenteru
Napadá mě takový hack, jen z hlavy, co udělat filtr i pro action a pokud bude action číslo, tak vrátit default jako akci, pak by to mohlo fungovat. A ten druhý filtr pak tam budeš nejspíše potřebovat přístup i k další části url, k tomu <id> abys mohl vrátit jen to. Či-li tam buď parsovat router, anebo lépe použít tohle.
- akadlec
- Člen | 1326
Jiří Nápravník: Já tohle hledal dlouho a překvapilo mě, že to nikdo neřešil a přitom je to takhle jednoduchý:-)
ale řešil, a sám si do toho tématu přispíval ;)
- Jiří Nápravník
- Člen | 710
Do toho tématu jsem přispíval, až po tomhle mém, když ho webdata vykopl nahoru… A spise jsem se ptal, jestli to neni to same jako resim ja filtrama
- duskohu
- Člen | 778
Jiří Nápravník napsal(a):
Rozdělení mám hodně podobně. Prostě jen ty front presentery apod. dám do dalšího podmodulu
Mám jen
app PageModule AdminModule presenters templates FrontModule presenters templates components models DI
Já tohle hledal dlouho a překvapilo mě, že to nikdo neřešil a přitom je to takhle jednoduchý:-)
Ahoj, pouzivam tiez rovnaku strukturu Module/Submodule, Podarilo sa niekomu vyriesit to routovanie v tvare:
- admin/page >> PageModule/AdminModule
- page >> PageModule/FrontModule
za prdpokladu ze modulov ako PageModule bude viac? Ja som sa pokusil napisat router ktory by to riesil, ale bohuzial som pohorel. Neviem sa dopracovat k nejakemu cistemu rieseniu.
- duskohu
- Člen | 778
Ano radil som to ja, ale vobec sa mi to nepaci :-) Neskusali ste niekto rozchodit ten router? ja mam zatial urobenu jednu cast a to match, este musim nejako dokoncit constructUrl. A ked to bude hotove, tak nemam ani sajnu ako implementovat prekladove tabulky.
Editoval duskohu (22. 1. 2014 13:59)
- duskohu
- Člen | 778
akadlec napsal(a):
Nepaci se ti co? Ze se ty routy delaji pro jednotlive moduly? Ja zacal ty moduly predelavat na extensions tak bych se casem rad dopracoval k tomu ze si ty routy nadefinuju v jeho inicializaci
Ako prerabas moduly na extension? :-o, Vsak v extension sa neda definovat presenter? Alebo da? To by som velmi rad vedel ako to robis?
- duskohu
- Člen | 778
Tak sa mi nejako podarilo dopisat ten modularRouter. Je to skor vezia –1.0 :-) sice to bude treba zrefaktorovat, ale funguje. Bol by som rad keby mal niekto zaujem a vedel by urobit nejak refactoring.
Co to vsetko vie?
Spracuvava to tuto strukturu:
app
CmsModule
AdminModule
presenters
FrontModule
presenters
???Module
AdminModule
presenters
FrontModule
presenters
cize:
- /admin/cms/… >> CmsModule/AdminModule/…
- /cms/… >> CmsModule/FrontModule/…
Ma moznost nastavit default module pre admin a pre front, to znamena:
- /admin >> nacita default admin module
- / >> nacita default front module
Ma moznost pre kazdu akciu presentra nastavit parametre ktore sa budu zobrazovat za lomitkom:
- /admin/homepage/edit/1
Nastavenie pouzivania lomitka na konci, alebo nie:
- setUseSlash()
Co to vsetko treba doriesit?
- refaktoring
- translate
- FILTER_IN, FILTER_OUT
Editoval duskohu (23. 1. 2014 12:44)
- Jiří Nápravník
- Člen | 710
Já mám taky moduly jako extensions, kde si nastavím routy jaké potřebuji pro daný modul (nad tím mám tedy nějaký AppModuleExtension, který má obecný router pro backend). Jinak já to dělám díky Flame\Modules http://blog.jsifalda.name/…e-nette-rout , ktrý umožňuje nastavit nejen routy pro moduly, ale i helpery,makra, doctrine entity, config file…