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

- mcmatak
 - Člen | 505
 
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
 
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…

- David Grudl
 - Nette Core | 8285
 
Jednoduše routy nesmí měnit request. Pokud to dělají, nechť se nediví ;)

- mcmatak
 - Člen | 505
 
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
 
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

- kravčo
 - Člen | 721
 
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í.