MultiRouter apprequest by se měl klonovat než ho začne zpracovávat routa, co když ho změní?

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

Těžko se mi chyba vysvětluje, ale snad ji pochopí někdo, kdo se v poslední době hrabal v routeru.

Jde o multirouter a funkci constructUrl, která prochází jednotlivé routy a na každé zkouší vygenerovat uri podle AppRequestu, je to tato část kódu:

<?php

		foreach ($this->cachedRoutes[$presenter] as $route) {
			$uri = $route->constructUrl($appRequest, $httpRequest);
			if ($uri !== NULL) {
				return $uri;
			}
		}


?>

nicméně představte si, že routa z nějakého důvodu mění request, proč by to dělala? no možná je to chyba návrhu ale měním název presenteru, na základě parametru v url měním modul, tedy z XXX:Test měním třeba na YYY:Test

což má za následek, že další routa nedostane starý XXX:Test, ale YYY:Test, ale já chci vždy pracovat s čistým requestem, ne s tím, který si pro účely vytvoření url routa změní

řešením je tohle

<?php

		foreach ($this->cachedRoutes[$presenter] as $route) {
			// musi se klonovat protoze routa upravuje apprequest a meni tak request i pro dalsi pozadavky
			$innerAppRequest = clone $appRequest;
			$uri = $route->constructUrl($innerAppRequest, $httpRequest);
			if ($uri !== NULL) {
				return $uri;
			}
		}

?>

dává to někomu smysl co se snažím popsat?

kravčo
Člen | 721
+
0
-

Oveľa väčší zmysel by mi dávalo takéto zmeny zakázať, ako uprednostniť klonovanie (malého) PresenterRequestu pri tvorbe každého odkazu. Odkazov sa v aplikácii zväčša generuje požehnane…

Teda, mám na mysli niečo takéto:

 // @ function Nette\Application\Presenter::createRequest
 // ...

     $this->lastCreatedRequest = new PresenterRequest(
         $presenter,
         PresenterRequest::FORWARD,
         $args,
         array(),
         array()
     );
+   $this->lastCreatedRequest->freeze();
     $this->lastCreatedRequestFlag = array('current' => $current);

     if ($mode === 'forward') return;

     // CONSTRUCT URL
     $uri = $router->constructUrl($this->lastCreatedRequest, $httpRequest);

 // ...

Po tejto úprave úpravy $appRequestu nebudú možné, prípadne ho môžeš klonovať v svojom routri a následne meniť, v opačnom prípade ti vyskočí InvalidStateException…

mcmatak
Člen | 504
+
0
-

naklonovany request pujde menit pokud je freeze?

kravčo
Člen | 721
+
0
-

Pochopiteľne. github

mcmatak
Člen | 504
+
0
-

ok, nicméně mi přijde, že si akorát potvrdil nedostatek v nette routeru, než spíš moji obavu, že to dělám uplně blbě

Editoval mcmatak (17. 9. 2010 10:19)

David Grudl
Nette Core | 8228
+
0
-

Jednoduše routy nesmí měnit request. Pokud to dělají, nechť se nediví ;)

mcmatak
Člen | 504
+
0
-

ale jo to chapu, pak ma kravčo pravdu měli by být zmrzlé ne? tím pádem mne to nutí udělat si vlastní router a clonovat je tak jak to dělám, ale přišel bych na chybu o hodně hodin dříve :)

jinak nesmí měnit … no … třeba by to šlo napsat jinak no, ale jelikož to co putuje routama je hlavně request tak mne nenapadá jak do celého procesu vložit nějaké další info

Filip Procházka
Moderator | 4668
+
0
-

mcmatak:
a proč clonuješ appRequest pro všechny routy? když už tak si ho naklonuj přímo v té metodě, pokud víš že ho budeš měnit

David Grudl
Nette Core | 8228
+
0
-

Mohl by být zamrzlý, tady to je součástí kontraktu.

kravčo
Člen | 721
+
0
-

mcmatak napsal(a):

ok, nicméně mi přijde, že si akorát potvrdil nedostatek v nette routeru, než spíš moji obavu, že to dělám uplně blbě

V prvom rade som potvrdil nedostatok tvojho návrhu na zmenu (no offence). To, že routy môžu meniť request nemusí byť nutne zlé, určite existujú spôsoby ako to využiť. Napríklad nejaký FilterRouter, ktorý zmení request pre nasledujúce routy v poradí, pretože doplňte text, ktorý sa hodí.

mcmatak
Člen | 504
+
0
-

ok ok, takže přesouvám klon do routy z multirouteru a snad ok :) díky