L’uso del mod_rewrite è una pratica molto diffusa e il “routing degli URL” è alla base di molti framework PHP.
Per routing degli URL intendo associare a miosito.tld/aaa/bbb/ccc/ddd
l’azione bbb del controller aaa passando i parametri ccc e ddd.
Per esempio per un blog, per poter modificare un post l’URL potrebbe essere miosito.tld/admin/edit/mio-id-post
.
Arrivare fino a questo passo è abbastanza facile.
In pratica si riscrivono gli URL tipo miosito.tld/etc/etc
in miosito.tld/index.php/etc/etc
.
Per fare ciò bisogna ricorrere alla configurazione del webserver.
Si otterrà quindi la variable PHP $_SERVER['PATH_INFO']
. Se non la ottenete potete usare anche $_SERVER['REQUEST_URI']
eliminando il prefisso del sito (Flatpress utilizza questo metodo).
Supponiamo di avere in $url
allora la parte con i parametri.
Ora divido l’URL con le slash in modo da ottenere un array con tutti i vari parametri.
$url=explode('/', $url);
Arrivati a questo punto ci sono due diversi metodi per continuare: il primo è eliminare tutti gli elementi vuoti ovvero quelli creati per esempio dalle doppie slash, il secondo è quello di tenerli però pulire l’array in modo da avere almeno i primi due elementi pieni.
Nel caso della prima scelta basta usare array_filter
, nel caso della seconda invece dovete usare un ciclo e stare quindi più attenti.
Per il momento qui scrivo solo la prima.
$url=array_filter($url); // In ogni caso, resettiamo la numerazione $url=array_values($url);
Nella terza riga ho resettato la numerazione delle chiavi dell’array $url: è una scelta conveniente se volete usare dei for anziché dei foreach, qualora ce ne fosse bisogno.
Perfetto, una volta arrivati qui volendo abbiamo già un sistema funzionante di instradamento URL.
Tuttavia non mi sono soffermato su una questione: a volte sarebbe più bello poter usare URL che non seguono una struttura fissa.
Il framework CakePHP dispone di tale capacità ma la loro classe di instradamento degli URL è molto complessa.
Io invece volevo rimanere sul semplice e mi sono scervellato molto sulla questione, fino a quando non ho capito che il metodo proposto da TinyMVC era quella migliore.
In pratica sapevo che bisognava utilizzare le espressioni regolari, però avevo pensato per esempio a preg_match. Invece col loro metodo si usa preg_replace per portare un URL “strano” in un URL standard.
Perciò, prima di dividere la stringa in un array si può chiamare preg_replace
in questo modo:
$url=preg_replace($search, $replace, $url);
$search
è un array con tutti i pattern da trovare, ovvero gli URL “strani”. Ricordate che sono espressioni regolari.
$replace
è sempre un array e contiene ciò con cui gli URL strani devono essere sostituiti. Gli elementi di quest’array non sono espressioni regolari.
Una volta aggiunta anche questa funzionalità si può dire che il codice sia completo.
Ovviamente vi consiglio di metterlo meglio, almeno in una funzione.