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

Il pattern MVC (Model View Controller)

Analizziamo struttura e funzionamento del pattern MVC (Model View Controller) utilizzabile nella creazione di applicazioni PHP.
Analizziamo struttura e funzionamento del pattern MVC (Model View Controller) utilizzabile nella creazione di applicazioni PHP.
Link copiato negli appunti

MVC è l'acronimo di Model View Controller, un designs pattern molto usato in programmazione. In questo capitolo illustreremo la sua implementazione in PHP.

Layer separati e responsabilità separate

Un'applicazione Web in PHP può sostanzialmente essere implementata in due modi. Il primo modo, quello monolitico, non opera alcuna distinzione tra dati, logica dell'applicazione e struttura presentata al browser.

In questo modello, il codice PHP che ad esempio gestisce le query alla base di dati e genera il codice HTML delle pagine spesso risiede negli stessi file o nelle stesse funzioni, qualora si voglia adottare un approccio procedurale.

Il secondo modo, quello a livelli (layer), prevede la suddivisione di un'applicazione in tre livelli distinti ma interconnessi tra loro:

  1. livello dati: gestione della connessione e delle query alla base di dati sottostante;
  2. livello logico: elaborazione e gestione dei dati ricevuti dal livello inferiore;
  3. livello utente: output finale nel browser dell'utente.

Livello dati: Model

Il livello dati può essere implementato creando una classe base che gestisce la connessione e le query al database e più classi che solitamente rappresentano i modelli di dati.

Se abbiamo ad esempio una tabella MySQL chiamata orders, possiamo creare una classe Order che rappresenta la struttura di questa tabella. Infatti ipotizzando che la tabella abbia i campi date, customer e total la nostra classe avrà a sua volta le proprietà Order::date, Order::customer e Order::total.

La nostra classe potrà anche eseguire delle azioni, come ad esempio il salvataggio dell'ordine nel database o il reperimento di un ordine specifico, implementate attraverso metodi specifici.

Livello logico: Controller

Il livello logico gestito da una classe di tipo Controller si realizza creando dei metodi pubblici che prendono il nome di action (azioni).

Nell'implementazione PHP questi metodi e i loro parametri vengono messi in correlazione con gli URL delle richieste HTTP. Dato un percorso di un URL come:

/category/test

Avremo una classe controller chiamata Category con un metodo (action) pubblico chiamato comunemente index() così strutturato:

class Category { public function index($slug = null) {...} }

Il metodo ha come parametro opzionale la forma abbreviata (slug) del nome della categoria. Quindi se l'URL sarà come quello visto prima, il parametro sarà test e servirà a ottenere dal livello dati le informazioni su quella categoria specifica. Viceversa se la richiesta fosse stata:

/category

Il parametro sarebbe stato nullo ed in quel caso avremmo potuto reperire dal database il listato delle categorie presenti sul sito.

Spesso una classe Controller usa come nome di una action il nome effettivo del componente di un URL. Ad esempio, nel caso in cui avessimo:

/product/12

Avremmo:

class Shop { public function product($id) {} }

In questo caso il parametro è obbligatorio, perché senza l'ID del prodotto (nell'esempio è 12) non possiamo reperire i dati del singolo prodotto e quindi possiamo solo restituire un errore HTTP 404 o 403.

In ambiente LAMP la correlazione tra action dei controller e URL si ottiene reindirizzando tutte le richieste HTTP che non puntino a file e directory esistenti sul file index.php principale tramite le regole del file .htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Tuttavia queste regole da sole non bastano. Occorre una classe di utility che faccia da tramite tra le richieste HTTP e i vari controller, separando gli URL in componenti e caricando i metodi corretti delle classi.

Questa classe di solito viene denominata dispatcher o router e ne vedremo i dettagli nel prossimo capitolo.

Livello utente: View

Si deve pensare a questo livello in termini di output presentato o inviato all'utente nel client. Una view non è infatti sempre un template PHP/HTML che produce una pagina Web: può essere anche un file PDF, un'immagine, un file CSV, un documento JSON ecc. In questi casi a volte il template usato può essere diverso o non essere presente.

L'output di una View viene restituito da una action di un Controller solitamente dopo aver acquisito i dati dal database (Model). A questo punto vengono passate delle variabili alla View. Se si usa un template PHP, il nostro esempio del listato di categorie può essere templatizzato come segue:

<!-- /views/category.php -->
    <ul class="category-list">
<?php foreach($categories as $category): ?>
    <li><?= $category['name']; ?></li>
<?php endforeach; ?>
    </ul>

Come si può notare, è completamente assente sia la logica dei dati sia il loro reperimento dal database: c'è solo la rappresentazione dei dati in formato HTML.

Ti consigliamo anche