Špatné chování Routy při předávání parametrů se stejnou hodnotou

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

Zdravím,
chci se s vámi podělit o pro mě záhadné chování routeru a zároveň požádat o vysvětlení, pokud nějaké je.

Příklad:
Mám URL //domena.cz/clanky/clanky/stranka-1, kde dva z předávaných parametrů (pre a cat) mají stejnou hodnotu.

Pokud provádím routování viz následující kód s tím, že je parametr cat nepovinný, server vyhodí Bad Request Exception

new Route("[<lang>/]<pre {$presentersPattern}>[/<cat {$categoriesPattern}>][/[<name>-]<id \d+>]", ...);

Pokud je cat parametr povinný, funguje správně (ale je povinný, což není žádané)

new Route("[<lang>/]<pre {$presentersPattern}>/<cat {$categoriesPattern}>[/[<name>-]<id \d+>]", ...);
CZechBoY
Člen | 3608
+
0
-

Ukaž ještě ty reguláry.

Nightmare
Člen | 3
+
0
-

CZechBoY napsal(a):

Ukaž ještě ty reguláry.

Na těch to není závislé, to je odzkoušeno.

Pro příklad třeba:

$presentersPattern = "clanky|articles";
$categoriesPattern = "clanky|novinky|articles|news";

Editoval Nightmare (8. 11. 2016 13:27)

Nightmare
Člen | 3
+
0
-

Na problém jsem přišel.
Není způsoben parametry se stejnou hodnotou, ale díky nim se projevil.

Způsoben je nesprávným fungováním Route::FILTER_STRICT při mém použití překladového slovníku u jazykových mutací.

$langsRouting = array(
	Route::FILTER_TABLE => $languages->fetchPairs('code', 'id'),
	Route::VALUE => $languages->where('default', true)->fetchField('id'),
	Route::FILTER_STRICT => true
);

new Route("[<lang>/] ... ", array(
	'lang' => $langsRouting,
	...
));

V tomto případě je nutné do masky routy přidat omezení manuálně.

$langsPattern = implode('|', $languages->fetchPairs(null, 'code'));

$langsRouting = array(
	Route::FILTER_TABLE => $languages->fetchPairs('code', 'id'),
	Route::VALUE => $languages->where('default', true)->fetchField('id')
);

new Route("[<lang {$langsPattern}>/] ... ", array(
	'lang' => $langsRouting,
	...
));