Jednosměrná routa závislá na GET parametrech?
- ic
- Člen | 430
Dá se udělat aby ONE_WAY
router se matchnul jen v případě,
že má ty správné GET parametry?
mám router
$router[] = new Route('<path .+> ? md5 & expires', function ($presenter) {
die('gg');
}, Route::ONE_WAY);
kterému odpovídají adresy jako
web.tld/adresar/jinyAdresar/?md5=d7cb1c7d9fb8b279de1c96f89eb8e50b&expires=2147483647
ale i web.tld/adresar/jinyAdresar/
já bych potřeboval aby se matchnul pouze, pokud tam má GET parametry md5 a
expires , ale nevím jak na to :(
tohle by nějak mělo jít, ne?
případně ještě, může být router závislý na jiných než GET parametrech? REQUEST například?
- greeny
- Člen | 405
Router:
new Route("<path .+>", [
NULL => [
Route::FILTER_IN => 'myInFunction',
],
]);
Vlastní funkce / metody / lambda funkce (v routeru
myInFunction
):
function myInFunction($arguments) { // $arguments jsou všechny argumenty routy
$path = $arguments['path'];
if(!checkPath($path)) { // ověření cesty (např z databáze, jestli existuje, apod.), pokud potřebuješ
return NULL; // routa nematchne
}
if (!isset($arguments['md5']) || !isset($arguments['expires'])) {
return NULL; // routa nematchne
}
return $arguments; // vrátím pole argumentů
}
Protože je to ONE_WAY, tak druhej směr nepotřebuješ. (ale možná kecám a potřebuješ OUT a ne IN, teď si nejsem jistej).
Princip je ten, že filtry uvedeš pod klíčem NULL a dostaneš celý pole argumentů. V té funkci vrátíš NULL pokud routa nemtachne a nebo pole argumentů (případně upravených, jak je potřeba).
- ic
- Člen | 430
Vypadá to nadějně, ale routeru scházel presenter
takže jsem mírně upravil, abych vracel
return $arguments + array('presenter' => 'Nette:Micro');
jenže to mi zase přepisuje url adresu do podoby kterou pak už sežere
jiný
router web.tld?path=adresar&md5=e4Nc3iduzkWRm01TBBNYw&expires=2147483647
jak přepisování zabráním, nebo dělám něco špatně ?
- greeny
- Člen | 405
Presenter si tam přidej do defaultních argumentů jako normálně :)
new Route("<path .+>", [
"presenter" => "Nette:Micro",
NULL => [
Route::FILTER_IN => 'myInFunction',
],
]);
Pokud ti to sežere jiná routa, tak téhle dej větší prioritu (definuj dřív). Vzhledem k tomu, že v tom callbacku od filtru ověřuješ cestu i parametry a vracíš NULL, když to neprojde, tak by ti to nemělo dělat problémy s jinýma URLs.