I callback
Oltre ad utilizzare wildcards o espressioni regolari in modo statico, Code Igniter consente di sfruttare una logica dinamica di elaborazione degli URL tramite l'impostazione di callbacks. Un callback è una funzione richiamata al momento dell'elaborazione che deve restituire un valore stringa che rappresenta il valore finale a cui reindirizzare l'applicazione.
Invece di impostare staticamente una stringa possiamo usare una funzione che la calcola e la restituisce dinamicamente.
$route['prodotti/([a-zA-Z]+)/modifica/(\d+)'] = function ($product_type, $id)
{
return 'catalogo/modifica_prodotto/' . strtolower($product_type) . '/' . $id;
};
In questo caso, se ci troviamo ad esempio su prodotti/scarpe/modifca/10
verrà richiamato catalogo/modifica_prodotto/scarpe/10
. La funzione callback accetta tanti parametri quanti sono i match (le corrispondenze trovate nell'URL tramite il parsing dell'espressione regolare) della stringa elaborata. Nell'esempio precedente i match sono 2: la stringa del primo segmento e il valore numerico dell'ultimo segmento. I match/corrispondenze sono identificati dal contenuto tra parentesi tonde.
I callbacks, usati con le espressioni regolari, sono dunque uno strumento per gestire dinamicamente la personalizzazione degli URL.
I "verbi HTTP"
Nel contesto della gestione degli URL Code Igniter permette di usare anche i verbi HTTP, ovvero i metodi di richiesta HTTP (in PHP nativo puoi lavorare con essi tramite gli array globali $_GET
, $_POST
, $_REQUEST
). E' possibile gestire sia metodi standard, GET, POST, PUT, DELETE E PATCH, sia crearne di personalizzati.
Per utilizzare questa funzionalità occorre aggiungere un indice all'elemento desiderato dell'array $route
. Se vogliamo rimappare un URL specifico quando a questo viene fornita una richiesta PUT o POST agiremo nel modo seguente:
// rimappa a prodotti/aggiungi quando viene eseguita una richiesta HTTP PUT
$route['prodotti']['put'] = 'prodotti/aggiungi';
// rimappa a prodotti/aggiungipost quando viene eseguita una richiesta HTTP POST
$route['prodotti']['post'] = 'prodotti/aggiungipost';
Una richiesta PUT all'URL "prodotti" richiamerà il metodo aggiungi
del Controller Prodotti
, mentre una richiesta POST richiamerà aggiungipost
.
Vediamo un esempio in cui utilizzare sia una wildcard, nell'indice che identifica l'URL, sia una richiesta HTTP:
$route['prodotti/(:num)']['DELETE'] = 'prodotti/elimina/$1';
In questo caso una richiesta HTTP DELETE all'URL che presenta come primo segmento la stringa prodotti
seguita da un valore numerico, sarà rimappata verso il metodo elimina
del controller Prodotti
, a cui verrà passato il valore numerico corrisposto (match) come primo parametro.
I verbi HTTP sono opzionali e case-insensitive: scrivere 'post' o 'POST' non fa alcuna differenza.
Percorsi riservati
Nell'ambito della gestione e della rimappatura degli URL esistono 3 percorsi riservati e non sarà possibile utilizzare questi indici come parte delle elaborazioni:
'default_controller'
;'404_override'
;'translate_uri_dashes'
.
$route['default_controller']
punta alla locazione che verrà richiamata quando l'URL non contiene segmenti, come nel caso dell'URL root
. Si può impostare tale valore con la sintassi controllerName/methodName
o semplicemente con controllerName
. Nel secondo caso verrà richiamato il metodo di default index
dichiarato nel Controller:
// chiama Prodotti::welcome
$route['default_controller'] = 'prodotti/welcome';
// chiama Prodotti::index
$route['default_controller'] = 'prodotti';
$route['404_override']
indica quale Controller deve essere richiamato se il Controller indicato nell'URL non esiste. E' una funzionalità utile per gestire richieste a URL non previsti dal sistema. Utilizzando questo percorso la pagina 404 di default verrà sovrascritta, ma non verrà alterata la funzione interna show_404
che richiamerà la View error_404
in application/views/errors/error_404.php
.
$route['translate_uri_dashes']
è un percorso leggermente differente che accetta valori booleani. Questo parametro consente di sostituire automaticamente i caratteri "-" (dashes) con "_" (underscores) sia nei Controller che nei segmenti degli URL, risparmiando su eventuali controlli da aggiungere all'array $routes
. Dato che i dashes non sono accettati come caratteri validi per nomi di classi o metodi, generando fatal errors se utilizzati, questa funzionalità risulta obbligatoria nel caso analizzato.
$route['translate_uri_dashes'] = FALSE;
Code Igniter offre quindi ampia libertà quando si tratta di rimappare URL. Non si è obbligati a seguire logiche di default, creando invece logiche personali accessibili solo dall'applicazione. Questo comporta vantaggi soprattutto per la sicurezza: con la gestione degli errori 404 è possibile limitare la scelta dei segmenti solo a determinati campi, mentre con la rimappatura verranno richiamati Controller privati la cui esistenza è nota solo agli sviluppatori.