Parametry redirect() (vs link)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

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

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…

phx
Člen | 651
+
0
-

A co neco jako

$this->redirect300(...);
Tomik
Nette Evangelist | 485
+
0
-

phx napsal(a):

A co neco jako

$this->redirect300(...);

To není špatný nápad!

A.
Člen | 87
+
0
-

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.

Jod
Člen | 701
+
0
-

Tam sa dá spraviť magická metóda cez __call() myslím :)
Ale lepší sa mi zdá ten prvý príklad, bo aj napr. ruby on rails to používalo v ActiveRecord ORM a prešlo z názvu metódy do parametru.

romansklenar
Člen | 655
+
0
-

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)

David Grudl
Nette Core | 8218
+
0
-

Zatím ne

Vitek Jezek
hledá kolegy | 285
+
0
-

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 ; )

PetrP
Člen | 587
+
0
-

David Grudl napsal(a):

Zatím ne

A bude se to nějak řešit?

David Grudl
Nette Core | 8218
+
0
-

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

  1. vytvořit novou metodu redirectPermanent() (ale padá tak možnost použít jiný kód)
  2. 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
+
0
-

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

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

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.

phx
Člen | 651
+
0
-

Navrh pmg s pojmenovanou konstantou, nebo metodou je taky fajn. Ja osobne si nikdy nejsem jist ktere cislo je jake presmerovani.

pmg
Člen | 372
+
0
-

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

Tak už je to venku 1420-rev-225-zmena-poradi-parametru-presentercompo-nent-redirec-t