Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

CakePHP: il pattern MVC

Come è strutturato e a cosa serve il pattern MVC (Model View Controller) del framework Web CakePHP
Come è strutturato e a cosa serve il pattern MVC (Model View Controller) del framework Web CakePHP
Link copiato negli appunti

In un articolo precedente abbiamo introdotto CakePHP, il framework per lo sviluppo rapido scritto in PHP ed adatto a diversi progetti Web. Dopo aver spiegato come installare il framework, ora ci occuperemo di introdurre nello specifico il modello MVC del framework spiegando come implementare modelli, controller e viste in modo da poter iniziare il prima possibile con l'utilizzo di questo framework di sviluppo.

Il pattern MVC

Model View Controller è un design patter per software che aiuta a separare in modo logico il codice delle applicazioni rendendolo più riutilizzabile, facile da mantenere e da sviluppare. Il pattern MVC è un modo per separare un'applicazione in tre parti: i modelli, le viste ed i controller

I modelli rappresentano i dati trattati dall'applicazione, siano questi presenti su database, su disco o su altri strumenti di supporto fisico o volatile; le viste sono la parte visuale dell'applicazione: nello sviluppo web spesso sono template testuali che vengono riempite con dati dinamici al fine di produrre il codice HTML necessario, mentre nello sviluppo desktop sono i widget che rappresentano graficamente l'applicazione; infine i controller gestiscono invece la logica programmativa gestendo le richieste, leggendo e modificando i modelli ed applicando i risultati alle viste.

CakePHP, come la gran parte degli altri framework RAD (Rapid Application Development) nati successivamente a Ruby On Rails, ha deciso di adottare questo paradigma in modo da mantenere un'organizzazione di codice ormai di uso quotidiano per la maggior parte degli sviluppatori; a differenza di altri framework però il modello MVC è esteso anche alla gestione e salvataggio dei file ed anche ad altre situazioni in cui interagiscono tra loro gli oggetti.

Scaffolding

Prima di entrare nel dettaglio dei componenti MVC di CakePHP è interessante introdurre il processo di scaffolding: spesso le tabelle dei database cambiano e di conseguenza il programmatore deve occuparsi di modificare gli oggetti che interagiscono con queste ultime ed i form che si occupano di inserire i dati all'interno delle tabelle. Per ovviare a questo inconveniente, e rendere più semplice e produttivo il processo di sviluppo, è stato introdotto lo scaffolding che analizza il database generando i modelli e le viste necessarie per lavorare con queste ultime. Anche dopo che i dati sono stati modificati lo scaffolding permetti di aggiornare il codice autogenerato aumentando notevolmente la produttività ed eliminando quelle operazioni ripetitive che tendono a rendere tediose le operazioni di modifica successive agli aggiornamenti alla struttura del database.

I Modelli

Come già detto, un modello è un punto di accesso ad un database che permette di separare la logica dalla presentazione in modo più completo. Definire un modello in CakePHP è un'operazione molto semplice e solitamente comporta la creazione di un file PHP all'interno della cartella app/models avente come nome il nome del modello e contenente la definizione di una classe. Le classi definite come modelli ereditano da AppModel e contengono alcune proprietà e metodi necessari per il corretto funzionamento del modello.

Un modello è normalmente responsabile anche della validazione dei dati assegnategli dai controller e quindi capita spesso che la definizione di un modello contenga anche alcune opzioni per la validazione delle proprietà. Vediamo un semplice esempio di modello rappresentante un utente, che verrà successivamente analizzato

<?php

/** La classe AppModel è definita nel core di CakePHP
* e verrà automaticamente inclusa dal framework.
*/


class User extends AppModel
{
    /** Il nome del modello può essere estratto dal nome della classe,
    * ma è sempre buona norma specificarlo manualmente.
    */
    var $name = 'User';

    /** Un array per la validazione dei dati
    */
    var $validate = array(
    'username' => '/[a-z0-9_-]{3,}$/i',
    'password' => VALID_NOT_EMPTY,
    'email' => VALID_EMAIL,
    'age' => VALID_NUMBER
    );

    /** E' possibile specificare metodi specifici che espongano funzionalità
    * al chi utilizza il modello.
    */
    function ageIsAbove($minAge)
    {
        return ($this->age > $minAge);
    }
}

?>

Il modello così definito attingerà le informazioni dalla tabella users (al prurale, come spiegato nel nosto articolo precedente) ed applicherà alle proprietà age, email, username e password le opzioni di validazione specificate. La validazione può essere rappresentata da un validatore standard (utilizzando una costante che rappresenta uno dei validatori definiti nella libreria di base) oppure da un'espressione regolare o funzione. Si può accedere alle proprietà del modello utilizzando le funzioni set ed read e sarà la classe AppController stessa che si occuperà della validazione.

La classe AppController espone una serie di metodi molto utili per recuperare i dati o ricercare all'interno di una classe di modelli specifica, che sono ben descritti e documentati nella documentazione ufficiale di CakePHP.

I Controller

I controller sono utilizzati per gestire la logica dell'applicazione. Leggono i dati dai modelli ed utilizzano le viste per rappresentare i risultati delle elaborazioni effettuate; un controller definisce una serie di funzioni che vengono richiamate automaticamente dal core di CakePHP in base alle regole di routing definite oppure al sistema di pubblicazione dei controller standard. Normalmente, quando viene richiesta una pagina, l'URL richiesto viene elaborato dal framework che si occupa di trovare il controller corrispondente alla richiesta e successivamente richiamare la funzione specifica, solitamente rappresentata dall'ultima porzione dell'URL richiesto.

I controller sono contenuti all'interno della directory app/controllers e sono rappresentati da una classe che estende la classe base AppController. Le classi definite espongono una serie di metodi che verranno eseguiti automaticamente dal framework. Vediamo un semplice esempio:

<?php

/** La classe AppController è definita nel core di CakePHP
* e verrà automaticamente inclusa dal framework.
*/


class PostController extends AppController
{
   
function view($post_id)
   
{
       
// operazioni per la visualizzazione del post $post_id
   
}

   
function delete($post_id)
   
{
       
// operazioni per la rimozione di un post
   
}

   
function search($query)
   
{
       
// operazioni per la ricerca dei post che rispondono alla query $query
   
}
}

?>

Il controller così definito espone le azioni view, delete e search. I parametri dei metodi vengono stratti automaticamente dall'URL prendendo le parti di URL che non sono state incluse durante il processo di estrazione del controller e della successiva azione. Nel nostro caso il controller potrebbe essere utilizzato nel seguente modo:

  • http://localhost/post/view/123: visualizza il post 123
  • http://localhost/post/delete/321: cancella il post 321
  • http://localhost/post/search/prova+ricerca: ricerca il post contenente la chiave prova + ricerca

La classe AppController espone una serie di metodi e proprietà utilizzabili per controllare la logica applicativa. Di sicuro interesse è la proprietà data che viene automaticamente riempita con i dati inviati via POST e che può essere utilizzata per lavorare sui modelli anche direttamente, grazie al metodo setData della classe AppModel. Altre funzioni che si utilizzeranno molto spesso sono la funzione set, per assegnare uno o più valori ad una vista, la funzione redirect per reindirizzare la richiesta ad un'altra azione e la funzione flash, che visualizza per un determinato lasso di tempo un messaggio all'utente.

Le Viste

Come ultima funzionalità da analizzare abbiamo le viste. Le viste non sono altro che semplici template PHP che servono per visualizzare in HTML i risultati delle azioni svolte dai controller. Le viste sono contenute all'interno della directory app/views.

Ogni azione ha normalmente associata la sua vista specifica che viene renderizzata alla fine dell'esecuzione della funzione. Alla vista viene passata una variabile $data che contiene tutti i dati assegnati dal controller attraverso la funzione set o altri strumenti di assegnazione. Al fine di rendere le viste il meno ripetitive possibili, CakePHP offre la possibilità di utilizzare anche i layout, che sono delle template speciali che vengono applicate automaticamente intorno alle viste in modo che in queste ultime sia contenuto solamente il codice HTML relativo alla parte direttamente interessata dal controller.

In questo modo è possibile specificare header e footer della pagina in un unico file e condividerlo con molte viste in modo che una singola modifica si ripercuota su tutte le template. Vediamo un esempio di layout:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
       <title><?php echo $title_for_layout?></title>
   </head>
   <body>
       <div id="header">
           <div id="menu">...</div>
       
</div>

        <!-- Qui viene visualizzata la vista -->
       
<?php echo $content_for_layout ?>

       <div id="footer">...</div>
   </body>
</html>

e successivamente un esempio molto semplice di vista per visualizzare degli ipotetici post:

<h1><?php echo $data['Post']['title'] ?></h1>
<p><small><?php echo $data['Post']['author'] ?></small></p>
<p><?php echo $data['Post']['content'] ?></p>

Come possiamo notare la vista specifica solamente la parte strettamente inerente al rendering del contenuto, mentre il resto della pagina è definita dal layout principale, che potrà essere assegnato alla vista utilizzando la proprietà layout del controller eseguito.

Ti consigliamo anche