Submoduly – lze řešit jedinou routou?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Pavel S.
Člen | 24
+
0
-

Zdravím,

narazil jsem na drobný problém s routováním. Moje aplikace sestává z několika modulů, z nichž většina je opět sestavená z menších (sub)modulů. Některé jsou ještě dále dekomponovány.
Aplikace má podobnou strukturu jako je tato:

AModule
--BModule
--CModule
----DModule
EModule

Každý modul pak samozřejmě obsahuje několik presenterů, které využívají patřičné akce. Mým cílem je mít všechny URL sestavené z názvů modulů oddělených lomítky, tedy nepříklad pokud DModule obsahuje DisplayPresenter s akcí renderDefault(), aby URL vypadala takto:

exapmle.com/a/c/d/display/default

Vím, že obecně je to nerozhodnutelný problém kvůli možnému konfliktu méně zanořených modulů s více parametry (také oddělenými lomítky). V tuhle chvíli to řeším tak, že pro každý list stromu modulů mám napsanou vlastní routu, například pro výše uvedenou URL:

$router[] = new Route('a/c/d/<presenter>/<action>', array(
        'module' => ''A:C:D',
	'presenter' => 'Display',
	'action' => 'default',
));

Množství rout už je celkem velké. Existuje nějaký způsob, jak tohle řešit jednou routou (nebo nějakým jiným konstantním počtem rout)? Případně pokud se někdo setkal s podobným problémem, jak jste ho řešili? Zkoušel jsem použít i překladové tabulky (slovník), ale lomítko v cestě je interpretováno špatně (ovšem možná jsem jen špatně napsal pravidla). Přijde mi ale mnohem více uživatelsky přívětivé, než třeba pomlčka (která je typicky využívána k oddělení slov na stejné úrovni logiky, viz například URL tohoto vlákna na fóru).

Předem díky za jakékoli tipy, nápady nebo odkazy vedoucí k vylepšení.

Editoval Pavel S. (24. 11. 2010 23:39)

Jur4
Člen | 51
+
0
-

Tohle jsem uz taky resil a k vysledku jsem se nedobral. Zatim tech modulu neni tolik, ale do budoucna to muze byt problem, takze nejake reseni by bylo dobre.

Snad jen tohle, abych nemusel routy upravovat pokazde, kdyz pridam/odeberu/prejmenuju modul, tak se mi v testovacim rezimu routy automaticky sestavujou podle stromu slozek *Module. Kdyz se nahazuje produkcni verze tak si vygeneruju aktualni routy a zapisu je manualne aby nedochazelo ke zbytecnemu zpomaleni.

Filip Procházka
Moderator | 4668
+
0
-

jedno z řešení je vyžadovat celou cestu, pak si můžeš dovolit něco takového :) ozkoušej to a řekni jestli to funguje :)

Route::$styles[Route::MODULE_KEY] = array(
	Route::PATTERN => '.*',
	Route::FILTER_IN => function($s){
		$s = ucwords(preg_replace('#([\/-])(?=[a-z])#', '$1 ', strtolower($s)));
		$s = str_replace('/ ', ':', $s);
		$s = str_replace('- ', '', $s);
		return $s;
	},
	Route::FILTER_OUT => function($s){
		$s = preg_replace('#([^.])(?=[A-Z])#', '$1-', strtr($s, ':', '/'));
		return rawurlencode(strtolower($s));
	},
);

$router[] = new Route('[!<module>][!/<presenter>][!/<action>]', array(
	'module' => 'Default'
        'presenter' => 'Default',
        'action' => 'default',
));