Nella prima parte di questa mini-serie dedicata a CodeIgniter abbiamo preso confidenza con la sua configurazione di base e abbiamo visto come si realizza un semplice controller. In questo secondo appuntamento impareremo ad utilizzare le View (viste) per la formattazione delle pagine.
Il problema del controller “tuttofare”
Il pregio principale del design pattern Model/View/Controller (MVC) è che permette di suddividere un’applicazione complessa in componenti più semplici, raccogliendo e isolando le funzionalità in strati applicativi. Il controller d’esempio che abbiamo visto nel primo articolo viola palesemente questo requisito, difatti presenta non pochi problemi. Esaminamo brevemente il suo metodo index():
function index() { echo '<html><body>'; $name = $this->input->get('name'); if ($name) { echo "Hello, <strong>$name</strong>!"; } else { echo 'Hello, <strong>World</strong>!'; } echo '</body></html>'; }
Notare come il codice del controller si occupi non solo della raccolta e processamento dei dati, ma anche della formattazione della pagina stessa. Questo modo di lavorare è molto scomodo, ce ne possiamo rendere conto osservando la quantità di istruzioni necessarie per produrre una pagina davvero minimale come quella in oggetto. Pensiamo a quanto possa diventare complicata la situazione con pagine complesse come quelle di un portale o di un’applicazione gestionale: tag HTML da bilanciare, caratteri speciali da quotare, gestione dei fine-linea, javascript, elementi dinamici… un lavoraccio!
La lettera “V” dell’acronimo MVC ci viene in aiuto, stiamo parlando delle View. Semplificando molto possiamo affermare che più o meno tutti i framework MVC funzionano in questo modo:
- il browser invia una richiesta;
- la richiesta viene esaminata e smistata al controller adeguato;
- il controller processa la richiesta e nel contempo salva delle variabili (dati, messagi, ecc.) che dovranno essere mostrati al client;
- il controller decide che view mostrare al client;
- le variabili vengono passate alla view, che le formatterà e le invierà al client sotto forma di pagina HTML, file PDF/Excel/CSV/ecc.
La fase di visualizzazione quindi avviene a “bocce ferme”, ovvero quando tutto il processamento è stato già completato. Di fatto nelle view non abbiamo (quasi) mai accesso ai servizi dell’applicazione come il database o altro; ciò può sembrare uno svantaggio, ma permette di semplificare molto la realizzazione dei template, che non hanno più responsabilità operative ma solo di visualizzazione.
Separazione dei compiti
Ecco una nuova versione del metodo index() del nostro controller, realizzato rispettando appieno la filosofia della separazione dei compiti:
public function index() { $name = $this->input->get('name'); if ($name) { $data['name'] = $name; } else { $data['name'] = 'World'; } $this->load->view('hello_view', $data); }
Come potete notare tutte le istruzioni di concatenazione di stringhe sono state eliminate. Al posto che stampare direttamente il contenuto salviamo tutto in un array associativo chiamato $data, che passeremo al metodo $this->load->view(). Questi si occupa di eseguire il template corretto, rendendo disponibili i dati memorizzati in $data come variabili del template. Le view di CodeIgniter sono dei semplici file PHP memorizzati nella directory application/views; creiamo quindi la view “hello_view”, salvando questo codice PHP nel file application/views/hello_view.php:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Esempi CodeIgniter</title> <style type="text/css"> body { background-color: #eee; font-family: Lucida Grande, Verdana, Sans-serif; font-size: 14px; color: #4F5155; } #container { margin: 40px; } #main { background-color: #fff; margin: 24px 0 24px 0; padding: 25px; border-bottom: 1px solid #CCC; } #header { color: #333; border-bottom: 1px solid #CCC; margin: 24px 0 2px 0; padding: 5px 0 6px 0; } #header h1 { font-size: 42px; font-weight: bold; } </style> </head> <body> <div id="container"> <div id="header"> <h1>Esempi CodeIgniter</h1> </div> <div id="main"> <p>Hello, <strong><?php echo $name;?></strong>!</p> </div> <div id="footer"> <small>Page rendered in {elapsed_time} seconds</small> </div> </div> </body> </html>
Abbiamo volutamente “esagerato” con la formattazione per mostrare che utilizzando questo meccanismo possiamo realizzare template anche molto complessi senza dover modificare una virgola del controller, che quindi si dovrà occupare solo di ciò che è di sua competenza, ovvero il processamento delle richieste (non la realizzazione di pagine HTML!).
Se vogliamo provare il controller, le URL da utilizzare non sono cambiate (ricordarsi di sostituire www.example.com con l’indirizzo di base della propria applicazione):
http://www.example.com/index.php/hello
e
http://www.example.com/index.php/hello?name=Dimitri
per stampare il nome passato come parametro.