Nota: Robert C. Martin (también conocido como tío Bob) explica esto de una manera mucho mejor y divertida en su nota clave, Architecture the Lost Years . Un poco largo pero enseña muchos buenos conceptos.
tl; dr: No piense ni planifique su aplicación en términos de MVC. El marco MVC es solo un detalle de implementación.
Lo más confuso de MVC es que los desarrolladores intentan usar todos los componentes pegados.
Intente pensar en los términos de un programa, no en los términos del marco.
Su programa tiene un propósito. Toma algunos datos, hace cosas con los datos y devuelve algunos datos.
De esa manera, el controller
es el mecanismo de entrega de su programa.
- Un usuario envía una solicitud a su programa (digamos, agregue un producto al carrito de compras).
- El controlador toma esa solicitud (información del producto e información del usuario), llama a la parte necesaria de su programa que manejará esta solicitud
$user->addToCart($product)
- Su programa (la función
addToCart
del objeto user
en este caso) hace el trabajo que pretende hacer y devuelve una respuesta (digamos success
)
- El controlador prepara la respuesta usando el
view
relevante: por ejemplo. en el objeto controlador $this->render($cartView('success')
De esta manera, los controladores se desacoplan del programa y se utilizan como mecanismo de entrega. No saben cómo funciona su programa, solo saben a qué parte del programa se debe llamar para las solicitudes.
Si desea utilizar otro marco, su aplicación no necesitará un cambio, solo tendrá que escribir los controladores relevantes para llamar a su programa y solicitar solicitudes.
O si desea crear una versión de escritorio, su aplicación seguirá siendo la misma, solo necesitará preparar un mecanismo de entrega.
Y el Model
. Piense en ello como un mecanismo de persistencia.
En el modo OO, hay objetos en tu programa que contienen los datos.
class User {
//...
private $id;
private $shoppingCart;
//...
}
class Product {
//...
private $id;
//...
}
Cuando agrega un producto al carro de la compra, puede agregar el product::id
al user::shoppingCart
.
Y cuando desee conservar los datos, puede usar la parte model
del marco, que generalmente consiste en usar un ORM, para asignar las clases a las tablas de la base de datos.
Si desea cambiar el ORM que usa, su programa seguirá siendo el mismo, solo cambiará la información del mapeo. O si desea evitar todas las bases de datos, solo puede escribir los datos en archivos de texto sin formato, y su aplicación seguirá siendo la misma.
Entonces, escribe tu programa primero. Si está programando con el modo 'OO', use objetos antiguos del lenguaje. No pienses en términos de MVC al principio.