Nota: Robert C. Martin (alias Zio Bob) lo spiega in modo molto migliore e divertente nella sua nota chiave, Architecture the Lost Years . Un po 'lungo ma insegna molti buoni concetti.
tl; dr: non pensare e pianificare la tua app in termini di MVC. Il framework MVC è solo un dettaglio di implementazione.
La cosa più confusa su MVC è che gli sviluppatori cercano di utilizzare tutti i componenti incollati insieme.
Prova a pensare nei termini di un programma, non nei termini del framework.
Il tuo programma ha uno scopo. Richiede alcuni dati, fa le cose con i dati e restituisce alcuni dati.
In questo modo, controller
è il meccanismo di consegna del tuo programma.
- Un utente invia una richiesta al tuo programma (diciamo, aggiungi un prodotto al carrello).
- Il controllore accetta quella richiesta (informazioni sul prodotto e informazioni utente), chiama la parte necessaria del tuo programma che gestirà questa richiesta
$user->addToCart($product)
- Il tuo programma (funzione
addToCart
dell'oggetto user
in questo caso) esegue il lavoro che intende eseguire e restituisce una risposta (diciamo success
)
- Il controllore prepara la risposta utilizzando il
view
pertinente: es. nell'oggetto controller $this->render($cartView('success')
In questo modo, i controller vengono disaccoppiati dal programma e utilizzati come meccanismo di consegna. Non sanno come funziona il tuo programma, sanno solo quale parte del programma deve essere chiamata per le richieste.
Se vuoi utilizzare un altro framework, la tua app non avrà bisogno di modifiche, dovrai solo scrivere dei controller rilevanti per chiamare il tuo programma per le richieste.
O se vuoi creare una versione desktop, la tua app rimarrà la stessa, dovrai solo preparare un meccanismo di consegna.
E Model
. Pensalo come un meccanismo di persistenza.
Nel modo OO, ci sono oggetti nel tuo programma che contiene i dati.
class User {
//...
private $id;
private $shoppingCart;
//...
}
class Product {
//...
private $id;
//...
}
Quando aggiungi un prodotto al carrello, puoi aggiungere product::id
a user::shoppingCart
.
E quando si desidera mantenere i dati, è possibile utilizzare la parte model
del framework, che generalmente consiste nell'utilizzo di un ORM, per associare le classi alle tabelle del database.
Se vuoi cambiare l'ORM che usi, il tuo programma rimarrà invariato, cambieranno solo le informazioni di mappatura. Oppure, se vuoi evitare i database tutti insieme, puoi semplicemente scrivere i dati in file di testo normale e la tua app rimarrà la stessa.
Quindi, scrivi prima il tuo programma. Se si programma con il modo "OO", utilizzare semplici vecchi oggetti della lingua. Non pensare in termini di MVC all'inizio.