Pregunta

Mi comprensión del MVC es la siguiente (en caso de que sea terriblemente incorrecto, después de todo, soy nuevo)

  1. Los modelos son las cosas que interactúan con la base de datos
  2. Las vistas son el diseño / diseño de la página
  3. Los controladores son donde todo comienza y son esencialmente la lógica de la página

Estoy usando CodeIgniter pero me arriesgaría a suponer que no solo se limita a eso o posiblemente solo a Marcos PHP.

¿Dónde pongo clases globales?

Es posible que tenga un modelo para Productos y luego ejecuto una consulta que recopila 20 productos de la base de datos. ¿Ahora hago 20 modelos o debería tener una clase separada para ellos, si este último, dónde pongo esta clase (otros controladores también deberán usarla)

¿Fue útil?

Solución

Modelo es la palabra incorrecta para usar cuando se discute qué hacer con los productos: cada producto es un objeto de valor (VO) (u objeto de transferencia de datos / DTO, lo que mejor se adapte a su boca). Los objetos de valor generalmente tienen los mismos campos que contiene una tabla. En su caso, ProductVO debería tener los campos que se encuentran en la tabla Productos.

El modelo es un Objeto de acceso a datos (DAO) que tiene métodos como

findByPk --> returns a single value object
findAll --> returns a collection of value objects (0-n)
etc.

En su caso, tendría un ProductDAO que tiene algo como los métodos anteriores. Este ProductDAO luego devolvería ProductVO y colecciones de ellos.

Los

Objetos de acceso a datos también pueden devolver Objetos de negocios (BO) que pueden contener múltiples VO y métodos adicionales que son específicos de casos de negocios.

Anexo: En su controlador, llama a un ProductDAO para encontrar los productos que desea. Los ProductVO devueltos se pasan a la vista (como atributos de solicitud en Java). Luego, la vista recorre / muestra los datos de los VVO del producto.

Otros consejos

El

Modelo es parte de su aplicación donde ocurre la lógica empresarial. El modelo representa relaciones y dependencias de la vida real entre objetos, como: El empleado informa a un Gerente, el Gerente supervisa a muchos Empleados, el Gerente puede asignar la Tarea al Empleado, la Tarea envía una notificación cuando está vencida. El modelo CAN y la mayoría de las veces HACEN interfaz con la base de datos, pero esto no es un requisito.

Ver es básicamente todo lo que se puede mostrar o ayudar a mostrar. La vista contiene plantillas, objetos de plantilla, maneja la composición y anidación de plantillas, se ajusta con encabezados y pies de página, y produce resultados en uno de los formatos más conocidos (X / HTML, pero también XML, RSS / Atom, CSV).

Controlador es una capa de traducción que traduce las acciones del usuario a las operaciones del modelo. En otras palabras, le dice al modelo qué hacer y devuelve una respuesta. Los métodos del controlador deben ser lo más pequeños posible y todo el procesamiento comercial debe realizarse en Modelo, y el procesamiento de la lógica de vista debe realizarse en Vista.

Ahora, volviendo a tu pregunta. Realmente depende si necesita una clase separada para cada producto. En la mayoría de los casos, una clase será suficiente y se deberían crear 20 instancias. Como los productos representan la lógica empresarial, debe pertenecer a la parte Modelo de su aplicación.

En CakePHP hay 3 más " partes " :

  1. Comportamientos
  2. Componentes
  3. Ayudantes

La lógica que utilizan muchos modelos debe hacerse como un comportamiento. No sé si CodeIgniter tiene esta lógica o no, pero si no la tiene, trataría de implementarla como tal. Puede leer sobre comportamientos aquí .

(Los componentes ayudan al controlador a compartir la lógica y los ayudantes ayudan a las vistas de la misma manera).

La forma más simple es:

  1. Tener una clase de modelo por tabla de base de datos. En este caso, sería un objeto que contenía todos los detalles del Producto.
  2. Coloque estas clases en un paquete / espacio de nombres, por ejemplo, com.company.model (Java / C #)
  3. Coloque las clases DAO en un paquete como com.company.model.dao
  4. Su vista consumirá datos de la sesión / solicitud / controlador En este caso, tendría una Lista < Product > ;.
  5. Oh, estás usando PHP. No sé cómo eso cambia las cosas, pero imagino que tiene un marco de Colecciones como cualquier lenguaje moderno.

@Alexander menciona CakePHPs Comportamientos , Componentes y Ayudantes . Estos son excelentes para abstraer la funcionalidad común. Encuentro que los comportamientos son particularmente útiles ya que, por supuesto, la mayor parte de la lógica empresarial se lleva a cabo en los modelos. Actualmente estoy trabajando en un proyecto donde tenemos comportamientos como:

  • Bloqueable
  • Publicable
  • Tagable
  • Tasable
  • Comentario

etc.

Para el código que trasciende incluso el marco MVC, es decir, las bibliotecas de código que usa para varias cosas que no están vinculadas al marco particular que está utilizando, en nuestro caso cosas como clases de codificación de video, etc. CakePHP tiene los proveedores carpeta.

Todo lo que efectivamente no tiene nada que ver con CakePHP entra ahí.

Sospecho que CodeIgniter no tiene una estructura tan flexible, es más pequeña y ligera que CakePHP, pero un vistazo rápido a CakePHP Manual para ver cómo pueden ser útiles los comportamientos, los componentes, los ayudantes y la carpeta de proveedores.

Debería ser fácil incluir solo algunas clases de ayuda comunes de sus modelos, manténgase agradable y SECO

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top