Articoli di questa serie
  1. Routing, Routes e Pretty URLs
  2. Route Elements, URL dinamici in CakePHP
  3. Passare Parametri URL alla Action
  4. Reverse Routing

In questo articolo (che corrisponde alla seconda parte della serie dedicata al routing di CakePHP), tratteremo i route elements e approfondiremo come collegare dei “token” ai nostri URL ed applicarli alle regole.

Route Elements

Definendo dei route elements nelle nostre routes andiamo ad impostare la posizione dei parametri nei nostri URL. Possiamo scegliere di posizionare un parametro in qualsiasi punto del nostro URL, indifferentemente dall’ordine con il quale verranno passati alla action richiesta. I valori dei route elements sono accessibili dal controller attraverso $this->request->params. I route elements, quando definiti, possono accettare come valore un’espressione regolare (opzionale) per controllare e validare l’indirizzo ed eseguire il match sulla regola. Ogni elemento senza espressione regolare viene trattato come un parametro.

Vediamo un esempio basilare dal CookBook

Questo esempio mostra come creare una route alla azione view di ogni controller. La regola seguente corrisponde ad un URL così formato /nomecontroller/:id. In questa regola sono specificati due route elements :controller ed :id. CakePHP ha degli elementi predefiniti e :controller è uno di questi. Il framework riconoscerà in automatico l’elemento :controller che verrà associato automaticamente al controller richiesto. L’elemento :id è un elemento personalizzato ed ha quindi la necessità di maggiori dettagli sul tipo di comparazione da eseguire. Nel terzo parametro di Router::connect andiamo a specificare l’espressione regolare che, in questo caso, accetterà solamente numeri. Vi consiglio regex101 per testare le vostre stringhe.

Una volta impostata questa regola possiamo richiamare la pagina /apples/5 o /apples/view/5 ottenendo lo stesso risultato: entrambe le regole chiameranno il metodo view() del controller ApplesController. Il parametro :id sarà accessibile all’interno di questo controller attraverso $this->request->params[‘id’].

Se la nostra applicazione ha un solo controller e non vogliamo farlo apparire nei nostri link possiamo mappare tutte le richieste a quel controller attraverso questa regola

Tutte le azioni ed i parametri verranno passati in automatico al controller definito, così sarà possibile accedere agli url attraverso /demo anziché /home/demo.

Vediamo un esempio avanzato preso dalla documentazione ufficiale

In questa regola abbiamo definito quattro elementi. Il primo è un elemento di default ed informa CakePHP che dovrà aspettarsi un nome di un controller. Gli tre elementi sono dei route elements personalizzati. Questa regola chiama di default l’azione index() del controller richiamato. L’ultimo parametro è un array che contiene le espressioni regolari che verranno controllate sui nostri elementi.

Non è possibile utilizzare le parentesi “()” per eseguire dei gruppi di cattura o opzionali. Per fornire un’alternativa alla regola possiamo utilizzare il carattere | (pipe).

Dettaglio Delle Regole

year – accetta in prima posizione un numero compreso tra 1 e 2. Richiede poi, per una lunghezza massima di 3 numeri, un valore compreso tra 0 e 9. Quindi 1999, 2001, 1996 sono tutte date valide, ma non 1896 o 3200.

month – accetta in prima posizione il numero 0 seguito da un numero compreso tra 1 e 9. In alternativa (notare il carattere “|” pipe) accetta in prima posizione il numero 1 seguito da uno dei seguenti numeri: 0, 1, 2.

day – è molto simile alla regola precedente. Accetta in prima posizione un numero composto da 0 più un numero da 1-9. La seconda alternativa è un numero che inizia per 1 o 2 più un numero compreso tra 0 e 9. L’ultima alternativa è un numero che inizia con 3 più un numero compreso tra 0 e 1. Questa regola permette di accettare giorni formati da 01, 02, 09, 10, 19, 29, 28, 30, 31 ma non 33, 34, 46, 72 etc…

L’ultima cosa da notare è la chiave dell’espressione regolare. La regola ‘year’ ha infatti lo stesso nome dell’elemento ‘:year’ escluso il carattere “:”.

Tutte queste regole insieme permettono di richiamare un URL del genere /articles/2007/02/01, /posts/2004/11/16, /comments/1996/10/11 e girare la richiesta ai corrispettivi controller richiamando l’azione index(). Ricordo ancora una volta che i parametri della data saranno accessibili dal controller attraverso $this->request->params.

Elementi Predefiniti

Come abbiamo visto nelle righe precedenti CakePHP ha degli elementi predefiniti e andrebbero utilizzati solamente evitando di sovrascriverli. Ecco la lista:

controller – Utilizzato per accedere al controller

action – Utilizzato per accedere all’azione (metodo)

plugin – Utilizzato per accedere al nome del plugin che contiene il Controller

prefix – Utilizzato per il Prefix Routing (Da trattare più avanti)

ext – Utilizzato per le estensioni dei file (Da trattare più avanti)

Conclusioni

Abbiamo visto come eseguire un controllo avanzato sulle nostre URL, nel prossimo articolo dedicato al Routing di CakePHP ci occuperemo di come passare i parametri alle azioni.

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)