Il pattern mvc non è particolarmente complesso, e puo anche essere semplificato per essere piu digeribile.
Dunque, se non vuoi fare una cosa troppo complicata potresti agire cosi:
tramite un file .htaccess reindirizzi tutte le richieste http alla index
Il codice potrebbe essere simile a questo:
Codice PHP:
AddType text/css .css
Options -Indexes +FollowSymLinks
RewriteEngine on
RewriteRule ^(it/|en/|fr/|de/|)([a-z0-9\/_-]+).html$ index.php?lingua=$1&azione=$2&%{QUERY_STRING} [L]
Cosa fa?
Semplicemente qualsiasi richiesta viene inviata alla index.php.
Esempio di indirizzo:
http://www.nomesito.it/contentuto/le...lo/123456.html
nella tua index avrai $_GET['azione']="contentuto/leggi/articolo/123456";
Alternativamente puoi anche gestire le lingue, per esempio
http://www.nomesito.it/en/contentuto...lo/123456.html
nella tua index avrai $_GET['azione']="contentuto/leggi/articolo/123456"; e $_GET['lingua']="en";
Come puoi vedere dall'htaccess, la lingua è opzionale (it/|en/|fr/|de/| significa che può essere it en fr de o niente, in tal caso sta a te inizializzare e gestire i contenuti e le lingue impostandone una di default (supponiamo l'italiano).
Ora concentriamoci su $_GET['azione']="contentuto/leggi/articolo/123456". E' qui che avviene tutto il meccanismo di routing.
Direttamente nella index dovresti:
a - richiamare eventuali file di configurazione per inizializzare la connessione al db, definire tue funzioni personalizzate, importare eventuali file di lingua, gestire la sessione e via dicendo
b - scomporre $_GET['azione'] con un "explode("/",$_GET['azione']). Otterrai cosi un array con cui definiremo classe, metodo e eventuali altri parametri.
Esempio
Codice PHP:
//nella index dopo aver incluso file di funzione e via dicendo
$azione=explode("/",$_GET['azione']);
$classe=$azione[0]; //la classe che andremo a utilizzare
$metodo=$azione[1]; //il metodo della classe che richiameremo
$parametri= array_slice($azione,2); //array contenente altri campi passati nella url, in questo caso "articolo" e "123456"
require_once("percorso_classi/classe_".$classe.".php");
$obj= new $classe($parametri); //costruisce un oggetto della classe richiamata, in questo caso "contenuto", passandogli l'array di parametri (articolo e 123456)
$obj->$metodo(); //esegue il metodo richiesto, in questo caso "leggi()";
La tua classe contenuto potrebbe essere qualcosa di simile
Codice PHP:
class contenuto {
private $parametri;
public function __construct($parametri) {
$this->parametri=$parametri;
}
public function leggi() {
$tipo_contenuto=$this->parametri[0];
$id_contenuto=$this->parametri[1];
//recupera da db il testo del contenuti con id 123456
//inizializza il template
//stampa avideo il template
}
private funcion metodo_privato1() {
....
...
}
private funcion metodo_privato2() {
....
...
}
}
Questo significa che se vuoi abilitare un nuovo tipo di indirizzo come http://www.nomesito.it/contenuto/sta...contenuto.html (dove id contenuto è chiaramente sempre l'id del contenuto da stampare) ti basta aggiungere un metodo pubblico "stampa" alla classe "contenuto".
Ogni volta che richiamo un metodo della classe contenuto, esso puo accedere anche ai metodi privati della sua classe
Ovviamente questa è una infarinatura, ti faccio qualche considerazioneimportanete:
1. tutte le classi andrebbero chiaramente inserite in una cartella non visibile all'esterno (quindi un livello sotto public_html)
2. tutte le classi dovrebbero estendere una "superclasse", che potrebbe chiamarsi class router, che fornisce cosi metodi comuni ad ogni classe (per esempio un metodo per richiamre il template dell'azione richiamata), o il costruttore in comune
3. con un template engine, dovresti creare un file .html per ogni metodo di ogni classe. Per esempio avere una cartella con il file tpl.contenutoLeggi.html che andrai a richiamare, parsare e restituire quando un url del tipo contenuto/leggi..." viene richiamato
4. nella tua index, prima di richiamare il metodo della classe richiesta, dovresti integrare una serie di funzioni o classi a tuo piacimento per inizializzare e gestire collegamenti mysql, template principale del sito, autenticazione e via dicendo (insomma un tuo piccolo framework)
5. sarebbe consigliabile inserire nella index un codice simile
Codice PHP:
try {
//..azioni della index che esplode l'azione e richiama la classe e il metodo
}
catch (eccezione $exception) {
//gestione dell'eccezione con redirect 404 e store dell'errore
}
in questo modo puoi gestire le eccezioni e gli errori di tutto il tuo applicativo (per esempio potresti lanciare una eccezione all'interno di contenuto->leggi se il contenuto 123456 non esiste!
I vantaggi di questa struttura sono notevoli:
1. sai sempre dove andare a guardare quando hai un problema in una pagina. questo perche sai che un indirizzo del tipo www.nomesito.it/newsletter/iscriviti.html richiama esattamente il metodo "iscriviti" della classe "newsletter"
2. tieni i file php e html completamente separati da loro (chiaramente i file html conterrano istruzioni php, come la stampa del titolo e testo di un contenuto, ma questo è la normale struttura di un template engine)
3. classi e template non sono pubblici, perche li puoi tenere sotto alla public_html, tenendo in pucli_html solo index, htaccess ed cartelle di img, js, css...
4. puoi accumulare in una variabile la stringa html che rappresenta il template, e stamparla solo alla fine dello script se non si sono verificati errori
5. con il try catch puoi gestire ogni tipo di errore o situazione ambigua chiudendo velocemente l'esecuzione
Ovviamente il discorso andrebbe ulteriormente approfondito. Per la gestione dei template ti consiglio raintpl (http://www.raintpl.com/?lang=ita).
Gabriele