Nota: Robert C. Martin (también conocido como tío Bob) explica esto de una manera mucho mejor y humorística en su discurso principal, Architecture the Lost Years . Un poco largo pero enseña muchos buenos conceptos.
tl; dr: No pienses y planifiques tu 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.
Tu programa tiene un propósito. Toma algunos datos, hace cosas con datos y devuelve algunos datos.
De esa manera, controller
es el mecanismo de entrega de su programa.
- Un usuario envía una solicitud a su programa (por ejemplo, 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 (
addToCart
función del user
objeto en este caso) hace el trabajo que está destinado a hacer y devuelve una respuesta (digamos success
)
- El controlador prepara la respuesta utilizando lo relevante
view
: 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 qué parte del programa debe llamarse para las solicitudes.
Si desea utilizar otro marco, su aplicación no necesitará un cambio, solo tendrá que escribir controladores relevantes para llamar a su programa para solicitarlo.
O si desea hacer una versión de escritorio, su aplicación seguirá siendo la misma, solo tendrá que preparar un mecanismo de entrega.
Y el Model
. Piense en ello como un mecanismo de persistencia.
En la forma OO, hay objetos en su programa que contienen los datos.
class User {
//...
private $id;
private $shoppingCart;
//...
}
class Product {
//...
private $id;
//...
}
Cuando agrega un producto al carrito de compras, puede agregar el product::id
al user::shoppingCart
.
Y cuando desee conservar los datos, puede usar la model
parte 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 permanecerá igual, solo cambiará la información de mapeo. O si desea evitar las bases de datos, 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 la forma 'OO', use objetos simples del lenguaje. No pienses en términos de MVC al principio.