2010-05-07 16 views
5

Mi problema está en algún punto entre modelo y controlador. Todo funciona perfecto para mí cuando uso MVC solo para crud (crear, leer, actualizar, eliminar). Tengo modelos separados para cada base de datos mesa. Accedo a estos modelos desde el controlador, para aplastarlos. Por ejemplo, en la aplicación de contactos, tengo acciones (crear, leer, actualizar, eliminar) en el controlador (contacto) para usar los métodos (de contacto) del modelo (crear, leer, actualizar, eliminar).Qué código debe ir Dónde en estructura MVC

El problema comienza cuando trato de hacer algo más complicado. Hay algunos procesos complejos que no sé dónde debo ponerlos.

  1. Por ejemplo, al registrar el proceso de usuario. No puedo terminar este proceso en el modelo de usuario porque también tengo que usar otros modelos (enviar correos, crear otros registros para el usuario a través de otros modelos) y hacer muchas validaciones complejas a través de otros modelos.
  2. Por ejemplo, en algunos procesos de búsqueda complejos, tengo que acceder a muchos modelos (artículos, videos, imágenes, etc.)
  3. O, a veces, tengo que usar apis para decidir qué haré a continuación o qué base de datos modelo que utilizaré para registrar datos

Entonces, ¿dónde está el lugar para hacer estos complicados procesos? No quiero hacerlos en controladores, porque a veces también debería usar estos procesos en otros controladores. Y no quiero poner estos procesos en modelos porque utilizo modelos como capas de acceso a la base de datos. Puede ser que estoy equivocado, quiero saber. Gracias por su respuesta .

+1

+1 Gracias por preguntar ... –

Respuesta

1

Para tareas simples, escribiría ayudantes de acción (por ejemplo, sendNewsletter).

Para tareas sofisticadas, crearé servicios (por ejemplo, correo electrónico, autenticación, etc.).

+0

Gracias por su respuesta, creo que su respuesta es como lo que creo, me refiero a que esta también es mi opinión. ¿Puede darme alguna fuente que me guíe sobre esta forma de escribir código o crear una estructura de mvc? –

+0

Si prefiere reservar, lea 'Desarrollo de aplicaciones web Zend Framework 1.8'. Para recursos en línea, vaya a google para 'zend framework action helpers' y consulte http://www.slideshare.net/weierophinney/playdoh-modelling-your-objects-1766001 (La famosa frase: las aplicaciones son como cebollas;) – takeshin

3

Solo un pequeño comentario (no hay solución) AFAIK es una pregunta eterna - MVC es solo un patrón, y como tal, es en teoría implementable limpiamente. En la práctica, debido a las limitaciones establecidas por las herramientas disponibles (como el contenido de la biblioteca del lenguaje de programación y el diseño de la interfaz del componente de la interfaz de usuario), debe tomar decisiones locales. Lo importante es que objetivo para separar estos ... y no tener todo en un solo desastre. Saco mi comentario del aire y me dejan ver si alguien tiene una "solución final".

+0

Estoy de acuerdo en su mayoría con esto ... – alex

+0

Esta es una buena 'generalización' como se puede esperar dado que en realidad se está haciendo referencia a -Visualizar variables experienciales-dado que estoy frustrantemente en la posición del cartel de preguntas. Voy a tener que difuminar el factor de limpieza de implementación de MVC para alcanzar mi objetivo. – HomeOffice

1

En MVC, debe colocar esas cosas en el modelo (por razones de reutilización para una).

Sin embargo, en HVMC, puede colocarlos donde sea (como en un controlador) y llamar a los controladores desde su aplicación.

+1

¿Qué hay de usar modelos dentro de otro? ¿Puedo llamar a cualquier modelo de otro modelo? Gracias –

+0

+1 por Oguz y @ alex ¿La misma pregunta para el controlador? –

+0

Sí puede, a menudo lo hago dentro de otro modelo 'if ($ this-> userModel-> loggedIn()) {}' – alex

1

Haría sus controladores simples.

De muchas maneras, el modelo le permite descargar una gran cantidad de la complejidad que de otra manera ocluiría su código de controlador. Es esta división de complejidad la que hará que su código sea más fácil de entender y de mantener.

personalmente Trato de que mis modelos se asemejen a objetos del mundo real, no tablas de bases de datos o filas. Lo hace mucho más fácil si ha hecho que las cosas hablen en términos más legibles. Un solo objeto del mundo real podría involucrar 5 o 6 tablas de base de datos ... Y sería una molestia bastante grande hablar con 5 o 6 modelos, cuando todo lo que quiere hacer es encender un interruptor, o elegir una flor, o pintar un icono o enviar un mensaje.

+0

@Bingy Can U pls se refieren a cualquier suh tutorial que me puede guiar de la manera que se asemeja a ur MVC? Incluso me gusta parecerme a cosas del mundo real ... los pls sugieren –

+0

no en la cima de mi cabeza ... es algo que tendrá sentido con la práctica. Una vez que lo hagas una o dos veces, tendrás una mejor idea. No tengas miedo de ir. Cuando vuelvas a ella unos días o una semana más tarde, estarás lleno de ideas sobre cómo podrías haberlo hecho mejor. Lo que quiere evitar es arrinconarse. por ejemplo, tener datos de sesión repartidos por el controlador/modelo/y otros controladores. Como ha creado muchos modelos para cada una de sus tablas, quizás se beneficiaría de tener un "supermodelo" que haga referencia a sus muchos modelos más pequeños. – Bingy

0

¿Qué pasa con un controlador que usa varios modelos?¿No es el objetivo de MVC hacer que el modelo sea reutilizable? En su primer escenario, está perfectamente bien enviar correos electrónicos y manipular otros objetos del modelo desde donde esté el código del controlador "registrar usuario".

En lo que respecta a su segundo escenario, ¿por qué no SearchController uso ArticleModel, ImageModel y VideoModel? Está bien tener un controlador sin modelo. SearchController no necesita una clase SearchModel, simplemente usa las otras clases de modelo.

Estoy tratando de no entrar en una diatriba sobre MVC en aplicaciones web, pero básicamente, en mi humilde opinión, el controlador es solo una lista de alto nivel de pasos para completar una operación. Como un ejemplo áspero, el código de controlador "registro de usuario" debe hacer cada uno de los pasos siguientes en aproximadamente una o dos líneas de código:

  1. validar la entrada
    1. Si no es válido, volver a mostrar el formulario con un error
  2. crear el nuevo objeto UserModel de la entrada de un formulario
  3. Inserte el nuevo UserModel objeto en la base de datos
  4. Crear/editar cualquier otros objetos del modelo son necesarios
  5. Envíe de un correo electrónico al nuevo usuario
  6. Display un "registro exitoso" página

Cómo se codifican esos pasos en gran medida depende de lo que sea marco/Arquitectura que' re usando

+0

Hay muchas razones de por qué no puedo usar el controlador para validar datos o para hacer otros procesos complejos. Por ejemplo, a veces tengo que repetir este método desde otro controlador, así que no debería volver a escribir este código en otro controlador. Además, Controller no conoce el modelo de reglas de validación requerido, solo proporciona datos, y el modelo valida estos datos. No soy la mejor persona para comprender las razones por las que no tiene que validar los datos en el controlador, pero estoy seguro de que debe no hacer eso en el controlador. –

+0

No importa si la clase de modelo contiene la función de validación. El controlador solo necesita un verdadero/falso que indique si la entrada es válida o no. –

0

Mantenga sus controladores limpios. Para el procesamiento de back-end use clases de administrador como MailManager, etc.

Cuestiones relacionadas