Parametry redirect() (vs link)
- David Grudl
- Nette Core | 8218
Trošku mě trápí metoda redirect()
, která narozdíl od
link()
má třetí volitelný parametr – HTTP kód
přesměrování. Parametry odkazu je tedy nutné uvést v poli (druhý
parametr), narozdíl od link(), kde je možné pole rozvinout
$this->link('action', $id, 300, TRUE, ...)
.
Nicméně redirect nyní akceptuje i zápis
$this->redirect('action', $id)
, bere to jako
$this->redirect('action', array($id))
. A na problém je
zaděláno. Jakmile někdo přidá další parametr odkazu, nemusí si
uvědomit, že musí použít pole, napíše
$this->redirect('action', $id, 300, TRUE)
a on se provede
redirect na 'action', $id
s HTTP kódem 300.
Tak si říkám, jestli nemá být druhý parametr polem povinně, nebo naopak jestli kód přesměrování nepředávat jinak.
- Tomik
- Nette Evangelist | 485
Co nejprve někde definovat, jaký kód pro přesměrování chci použít, třeba takto:
<?php
$this->redirectCode = 300;
?>
A pak jen zavolat
<?php
$this->redirect('action', $id, 2);
?>
S tím, že by to bylo stejné jako u linku.
redirectCode asi není nejlepší název, ale něco podobného…
- A.
- Člen | 87
David Grudl napsal(a):
Tak si říkám, jestli nemá být druhý parametr polem povinně, nebo naopak jestli kód přesměrování nepředávat jinak.
Myslim, ze klidne.
Ja taky pouzivam pole vzdy, a to asociativni, jelikoz kazdej vi, ze za dva roky v tom FooBarPresenteru se prijde na lepsi nazev toho parametru a k tomu se tam pridaj jeste dalsi dva kolem nej :-).
$this->redirectCode = 300;
To mi prijde zbytecne ukecany, kdyz je to vec parametru toho volani.
$this->redirect300()
Hezke mozna, ale preci blbost :-). Delat tri funkce pro kazdy typ? A az
vyjde HTTP 1.2 s presmerovaci hlavickou 807, musel by david dodelat
$this->redirect807
.
- romansklenar
- Člen | 655
Pořesilo se toto nějak nakonec? (chystám si poznámky na update nových věcí posledních několika desítek revizí do dokumentace tak zpětně pročítám fórum za poslední měsíc a půl)
- Vitek Jezek
- hledá kolegy | 285
musim potvrdit, ze jsem si zrovna dneska lamal hlavu, proc doprkynka „Bad HTTP response ‚0‘.“. Co takhle tam dat treba jen komentarik, zda nechceme pouzivat radeji array()? Pri ladeni v ladence by byl videt a to by clovekovi pak docvaklo (pokud to bude z komentare jasne ; )
- David Grudl
- Nette Core | 8218
Nakonec mě něco napadlo.
Pokud vezmeme, že
- při přesměrování během POST požadavku se prakticky vždy použije kód 303
- při přesměrování během GET/HEAD požadavku se prakticky vždy použije 302 nebo 301 (v Nette 301 mnohem méně často)
tak výchozí hodnota by podle metody byla 302 nebo 303. Jako alternativní kód by se používal nejčastěji 301, ale i tak spíš zřídka. Pro něj by bylo možno
- vytvořit novou metodu redirectPermanent() (ale padá tak možnost použít jiný kód)
- dát HTTP kód jako volitelný první parametr.
Příklady:
$this->redirect('action', $id, $lang); // s výchozím HTTP kódem
$this->redirect(301, 'action', $id, $lang); // s HTTP kódem 301
$this->redirectPermanent('action', $id, $lang); // s HTTP kódem 301
- Patrik Votoček
- Člen | 2221
Všechna řešení jsou pěkná. Kdyby to záleželo na mě tak by implementoval vše ale proč tam mít něco 2×. A tak jako nejlepší a nejuniverzálnější řešení zdá:
David Grudl napsal(a):
$this->redirect(301, 'action', $id, $lang); // s HTTP kódem 301
Napadlo mě ještě:
$this->redirect('action', $id, $lang)->code(301); // s HTTP kódem 301
//nebo
$this->code(301)->redirect('action', $id, $lang); // s HTTP kódem 301
Je jasné že metoda code se nemusí jmenovat code a taky je tu jeden zádrhel a to přesměrování s defaultní hodnotou. A tak mě napadlo toto:
$red = $this->redirect('action', $id, $lang);
$red->process(301); // s HTTP kódem 301
$red->process(); // s výchozím HTTP kódem
//resp
$this->redirect('action', $id, $lang)->process(301); // s HTTP kódem 301
$this->redirect('action', $id, $lang)->process(); // s výchozím HTTP kódem
Co na to říkáte?
PS: Gratuju Davide k 2222 příspěvku
Editoval vrtak-cz (9. 3. 2009 19:01)
- pmg
- Člen | 372
Kolik kódů vlastně připadá v úvahu?
S301_MOVED_PERMANENTLY
S302_FOUND
S303_SEE_OTHER
S303_POST_GET
S307_TEMPORARY_REDIRECT
Čtyři, pět? A z toho ještě dva se stejným kódem + jeden defaultní.
Pro větší srozumitelnost je často lepší použít konstantu než číslo a
zápis redirectPermanent
je potom kratší:
$this->redirect(S301_MOVED_PERMANENTLY, 'action', $id, $lang);
$this->redirectPermanent('action', $id, $lang);
$this->redirectPostGet('action', $id, $lang);
$this->redirectTemporar('action', $id, $lang);
Ale dělat několik metod? Nebo použít přetížení? Kód se při tomto způsobu nedá určit dynamicky a předat parametrem.
<small>Gratuluji Davidovi k 2223. příspěvku a 223. revizi.</small>
- David Grudl
- Nette Core | 8218
Ta varianta s volitelným prvním parametrem je trošku tricky, ale i s odstupem mi připadá nejschůdnější. Nicméně ji nelze provést zcela zpětně kompatibilní. Takže bude potřeba opravit kód.
- pmg
- Člen | 372
Konstantu lze použít už teď, to nebyl návrh. Jen jsem chtěl upozornit na fakt, že je ta konstrukce potom delší. Ale možná, že si rozumíme. Napsal jsem to ale špatně:
// chybělo rozhraní
$this->redirect(IHttpResponse::S301_MOVED_PERMANENTLY, 'action', $id, $lang);
// nebo dokonce
$this->redirect(Nette\Web\IHttpResponse::S301_MOVED_PERMANENTLY, 'action', $id, $lang);
Konstanty s patřičným kódem jsou definované v rozhraní Nette\Web\IHttpResponse.
Varianta s volitelným parametrem je samozřejmě pěkná. Chtěl jsem napsat, že by bylo nejlepší posílat všechny redirekty pod stejným kódem. Ale 301 je přecejen lepší rozlišit. Tato varianta mi umožní použít default.
- David Grudl
- Nette Core | 8218
Tak už je to venku 1420-rev-225-zmena-poradi-parametru-presentercompo-nent-redirec-t