Oggi vediamo come si configurano i Routing di CakePHP.

Il Routing (letteralmente “instradamento”)  serve per mappare un URL ad un’azione di un controller. La funzione principale del Routing è ottenere dei link più semplici ed utili, i classici “Pretty URLs”. L’utilizzo del mod_rewrite (o equivalente in base al sistema) non è un requisito, ma è altamente consigliato per avere un indirizzo più pulito.

Grazie al Routing di CakePHP possiamo effettuare il “reverse routing” ed ottenere una stringa rappresentante la risorsa partendo da un array. Questo consente una strategia delle url più compatta ed efficiente. Inoltre possiamo in qualsiasi momento cambiare la nostra struttura dei link senza dover cambiare il codice.

La configurazione delle Routes

Troviamo il file di configurazioni delle routes in /app/Config/routes.php. Questo file è processato da sopra a sotto e, quando arriva una nuova richiesta al Dispatcher, la prima regola, in ordine di definizione, che può soddisfare la richiesta, viene applicata. Il posizionamento delle varie regole può avere un effetto positivo o negativo sulla nostra applicazione. È opportuno inserire le regole che corrispondono alle pagine più visitate in alto, così da evitare di fare un controllo di corrispondenza sulle regole non necessarie ad ogni richiesta.

Come accennato poche righe fa, le routes vengono processate dalla prima a l’ultima in ordine di definizione. Se due routes sono simili e possono soddisfare entrambe la richiesta, la prima regola incontrata avrà priorità. E’ possibile modificare l’ordine delle routes utilizzando Route::promote().

Routing, impostazioni di default

CakePHP ha delle routes di default pre-impostate che sono sufficienti a far funzionare qualsiasi applicazione. Puoi accedere ad una action di un controller attraverso l’URL semplicemente digitandone il nome. È inoltre possibile passare dei parametri alla action utilizzando l’URL.

Ecco un esempio: http://localhost/controller/action/parametro1/parametro2/parametro3/etc…

L’URL /contacts/add per esempio sarà mappato automaticamente alla action add() del controller ContactsController, mentre /phones/view sarà mappato all’azione view() del controller PhonesController. Se non è specificata una action nell’URL di default viene richiamata la index(). Per esempio /mails richiamerà la action index() del controller MailsController.

Possiamo passare i parametri alla action utilizzando l’URL. Per esempio l’URL precedente /mails/view/23 è corrispondente a chiamare la action view(23) nel controller MailsController.

È possibile disabilitare le routes di default eliminando dal file /app/Config/routes.php la seguente riga

Route Connect

Possiamo collegare un URL ad un’azione utilizzando il metodo Router::connect() nel file /app/Config/routes.php.

Il metodo connect() accetta tre parametri: la URL desiderata, la action e le espressioni regolari.

Vediamo un esempio basilare

Il primo parametro è la URL desiderata ed è formato da una stringa divisa dal carattere “/”. C’è la possibilità di utilizzare il carattere “*” come wildcard o i Route Elements (li tratteremo più avanti). Utilizzando la wildcard possiamo dire alla route di accettare qualsiasi argomento aggiunto alla url.

Per esempio

Questa route accetterà qualsiasi parametro passato dopo la stringa iniziale, per esempio

  • /indirizzi/email
  • /indirizzi/email/1
  • /indirizzi/email/altro-parametro
  • /indirizzi/email/ancora-un-parametro/1-id/mio-parametro

L’indirizzo verrà diviso e separato in questa maniera “controller/action/param1/param2/param3”, quindi nel caso dell’ultima risorsa ci sarà una chiamata al controller PhonesController e alla action index(‘ancora-un-parametro’,’1-id’,’mio-parametro’).

Il secondo parametro è un array associativo composto dalle chiavi controller, action, plugin e parametri di default da passare alla action.

Attenzione, anche se abbiamo creato una nuova route, l’URL /phones/view/12 sarà ancora valido perché impostate le routes di default come spiegato sopra.

Un altro utilizzo comune del Router è per generare degli alias di controller. Volendo girare tutte le azioni del Controller phones verso l’alias /numbers utilizzeremo il seguente codice

Con la seguente regola tutte le chiamate verso una URL che inizia per /numbers verrà girato al controller phones. Per quanto riguarda la stringa :action è un token, chiamato Route Element, verrà discusso nella seconda parte di questo articolo.

Conclusioni

Un solo articolo non è sufficiente per coprire un argomento così complesso e delicato come il Routing di CakePHP. Abbiamo analizzato le funzionalità basilari per creare le nostre prime chiamate a dei pretty url o degli alias di controller che ci consentiranno di muovere i primi passi in sicurezza, in attesa di snocciolare l’argomento nel prossimo articolo.

 

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)