cakephp - ventajas - modelo vista controlador php laravel
MVC: patrĂ³n correcto para referenciar objetos de un modelo diferente (4)
Creo que el punto clave para responder a su pregunta se define por sus especificaciones: "... autores populares para que el usuario seleccione como asociado con ese libro".
Eso, además del hecho de que traes a todos los autores, me hace preguntar: ¿Cuál es el criterio que usarás para determinar qué autores son populares?
Lo dudo, pero si eso depende del libro actual que se está agregando, o de algunos campos anteriores que el usuario ingresó, tiene algún sentido adoptar la solución B y escribir la lógica dentro del modelo del Libro.
La solución más probable A es la correcta porque su caso necesita el código para encontrar autores populares solo en la acción de agregar del controlador del libro. Es una "característica" de la acción de adición solamente, por lo que debe codificarse dentro del modelo de Autor para recuperar la lista y ser invocado por la acción de agregar al preparar el formulario "vacío" para pasar la lista a la vista.
Además, tendría sentido escribir algún código similar dentro del modelo de Libro si quisiera, por ejemplo, mostrar todos los otros libros del mismo autor.
En este caso, parece querer autores populares (¿aquellos con más libros?), Por lo que esta es claramente una "característica adicional" del modelo de autor (que incluso podría codificar como un método de búsqueda personalizado).
En cualquier caso, como también lo han expresado otros, no es necesario volver a cargar el modelo de Autor, ya que se carga automáticamente a través de su asociación con Libros.
Estoy usando CakePHP2.3 y mi aplicación tiene muchas asociaciones entre modelos. Es muy común que una acción del controlador implique manipular datos de otro modelo. Así que empiezo a escribir un método en la clase de modelo para mantener los controladores delgados ... Pero en estas situaciones, ¿nunca estoy seguro de qué modelo debería usar el método?
Aquí hay un ejemplo. Digamos que tengo dos modelos: Libro y Autor. El autor tiene muchos libros. En la vista / books / add, es posible que desee mostrar una lista desplegable de autores populares para que el usuario los seleccione como asociados a ese libro. Entonces necesito escribir un método en uno de los dos modelos. Debería...
A. Escribe un método en la clase de modelo Author y llama a ese método desde dentro de la acción BooksController :: add () ...
$this->Author->get_popular_authors()
B. Escribe un método en la clase de modelo de libro que ejemplifica el otro modelo y usa sus funciones de búsqueda ... Por ejemplo:
//Inside Book::get_popular_authors()
$Author = new Author();
$populars = $Author->find(''all'', $options);
return $populars;
Creo que mi pregunta es lo mismo que preguntar "¿cuál es la mejor práctica para escribir métodos modelo que aborden principalmente las asociaciones entre otro modelo?" ¿Cuál es la mejor manera de decidir a qué modelo debe pertenecer ese método? Gracias por adelantado.
PD: No estoy interesado en saber si piensas que CakePHP apesta o no es "verdadero" MVC. Esta pregunta es sobre el patrón de diseño de MVC, no el marco (s).
Siga los estándares de codificación: get_popular_authors () esto debería estar encasillado en camel getPopularAuthors ().
Supongo que desea mostrar una lista de autores populares. Implementaría esto usando un elemento y almacenando en caché ese elemento y obteniendo los datos en ese elemento usando requestAction () para obtener los datos del controlador de autores (la acción llama al método del modelo).
De esta forma, el código está en el lugar "correcto", su elemento está en la memoria caché (bonificación de rendimiento) y reutilizable en cualquier lugar.
Eso me lleva de vuelta a
"¿Cuál es la mejor práctica para escribir métodos modelo que abordan principalmente asociaciones entre otro modelo?"
En teoría, puedes meter tu código en cualquier modelo y llamarlo a través de las asociaciones. Diría que el sentido común se aplica aquí: su método debe implementarse en el modelo / controlador que coincida más. ¿Está relacionado con el usuario? Modelo / controlador de usuario. ¿Es un libro que pertenece a un usuario? Libro modelo / controlador.
Siempre trato de mantener el acoplamiento bajo y poner el código en un dominio específico. Ver también separación de preocupaciones .
En mi humilde opinión, la función debe estar en el modelo que mejor se adapte a los datos que intenta recuperar. Los modelos son la "capa de datos".
Por lo tanto, si va a buscar "autores populares", la función debe estar en el modelo Author
, y así sucesivamente.
A veces, una función no se ajusta a ningún modelo "limpiamente", por lo que simplemente elige uno y continúa. Hay decisiones de diseño mucho más productivas que preocuparse. :)
Por cierto, en Cake, se puede acceder a los modelos relacionados sin obtener "otro" objeto del modelo. Entonces, si el Book
está relacionado con el Author
:
//BooksController
$this->Book->Author->get_popular_authors();
//Book Model
$this->Author->get_popular_authors();
ref: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#relationship-types
Cuidado con la Optimización Prematura. Solo crea tu proyecto hasta que funcione. Siempre puede optimizar su código o patrones de mvc luego de revisar su código. Y lo más importante después de que su proyecto esté terminado la mayor parte del tiempo, verá una forma más clara o mejor de hacerlo de manera más rápida / inteligente y mejor que antes.
No puede y nunca construirá un mvc o proyecto perfecto al mismo tiempo. Necesita encontrar una forma de trabajar que le guste o prefiera y con el tiempo aprenderá cómo mejorar su codificación.
Consulte para obtener más información acerca de la optimización prematura