Jednosměrná routa závislá na GET parametrech?

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

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
+
0
-

řekl bych že přes FILTER_IN (FILTER_OUT) to půjde udělat (viz dokumentace )

ic
Člen | 430
+
0
-

@greeny nešlo by prosím poradit ještě nějak více? :) ať to s těmi FILTER_IN / FILTER_OUT zkouším jak můžu, stejně mi nic nefunguje

greeny
Člen | 405
+
0
-

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
+
0
-

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
+
0
-

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.