MultiRouter apprequest by se měl klonovat než ho začne zpracovávat routa, co když ho změní?
- mcmatak
- Člen | 504
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 | 8228
Jednoduše routy nesmí měnit request. Pokud to dělají, nechť se nediví ;)
- mcmatak
- Člen | 504
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í.