Eccoci nella parte finale di questo mini corso dedicato al routing di CakePHP. In questa articolo scopriremo come utilizzare il reverse routing e Route::redirect. Se non hai confidenza con i Routes Elements ed il Routing di CakePHP ti consiglio di leggere gli articoli di questa serie.

Reverse Routing

Il Reverse Routing è una funzionalità di CakePHP che permette, attraverso l’utilizzo di un array di routing, la generazione di un URL corretto in base alle regole definite nel file di routing.  Se non ci sono regole vengono applicate le regole di default.

Facciamo un esempio con il seguente URL /articoli/3

Questo URL corrisponde alla seguente regola

Nelle view ora possiamo creare, utilizzando HtmlHelper, link verso questo articolo con la seguente stringa: $this->Html->link(‘/articoli/3’)

Ma cosa succede se improvvisamente scegliamo di cambiare la struttura dei link?

Viene in nostro aiuto HtmlHelper e la sua capacità di utilizzare il Reverse Routing.

Per creare un link in una view che punti verso la risorsa di cui sopra, utilizzeremo il seguente array URL

CakePHP cercherà corrispondenza con la regole nel file di routing e crearà per noi il link corretto (/articoli/3). Cambiando il primo argomento nella route cambieranno automaticamente tutti i link in reverse routing. Così se per qualsiasi motivo dovessimo scegliere di modificare gli URL sarà sufficiente modificare il file routes.php.

Il reverse routing è utilizzabile anche nei controller attraverso il metodo redirect

Utilizzando lo stesso array URL otteniamo un redirect verso la stessa pagina.

Possiamo generare la stringa verso la nostra pagina anche utilizzando il metodo statico Router::url

È possibile anche generare dei link con query string o ancore

Il link generato in questo caso punterà alla seguente pagina: /articoli/3?queryKey001=queryValue001#idAncora

Redirect Routing

Spesso capita di dover muovere una risorsa o rinominare un’intera struttura di link. In questo caso è sufficiente utilizzare il metodo redirect della classe Router. Il metodo redirect ci consente di rispondere con uno stato 30x e far puntare le richieste ad un’altra risorsa. Questo metodo differisce dal metodo connect perché crea un redirect attraverso gli headers se la regola ha corrispondenza. Possiamo indirizzare una richiesta ad un URL interno o esterno.

Vediamo come reindirizzare il nostro URL di inizio /articoli/3 verso /blog/articoli/3

Per prima cosa dobbiamo cambiare la regola di connect

Come possiamo notare è cambiato soltanto il primo argomento. Tutti gli esempi visti in precedenza con HtmlHelper, redirect e Router::url ora punteranno a /blog/articoli/:id.

I link esterni al nostro sito non sono a conoscenza di questo cambiamento, informiamo il browser utente che la risorsa è stata spostata (in questo caso temporaneamente).

ATTENZIONE

È consigliabile utilizzare lo status 302 per eseguire dei test nel redirect. Router::redirect utilizza lo status 301 di default che renderà il nostro redirect permanente.

Router::redirect accetta 3 argomenti:

  1. Il vecchio link
  2. Un array URL o stringa dove indirizzare il browser
  3. Parametri opzionali (status, persist, pass)
Qualsiasi richiesta che corrisponde ad /articoli/:id otterrà un redirect con status 302 verso il nuovo.
Il Named Parameter :id è passato attraverso la chiave persist.

Vediamo come eseguire il redirect ad un link esterno con status di 302

Rispetto all’esempio precedente ora tutte le richieste ad /articoli/:id otterranno un redirect verso google.it

Conclusioni

Con questo articolo si conclude la serie dedicata agli esempi di Routing con CakePHP. Siamo ora in grado di creare regole complesse e gestire tutti i link in un solo punto di ingresso. Vi ricordo come sempre di far riferimento alle API in caso di problemi o potete chiedere al gruppo sviluppatori CakePHP su Facebook.

Seguimi

Walter Raponi

Appassionato di torte!

Ingredienti base: Model, View, Controller! Un grande framework come CakePHP e la nostra torta è pronta!
Seguimi

Latest posts by Walter Raponi (see all)