Pregunta

1) ¿Dónde encaja la página de inicio de su sitio web en " controladores " ;? He visto a algunas personas usar una " página " Controlador para manejar páginas estáticas como, sobre, inicio, contacto, etc., pero para mí esto no me parece una buena idea. ¿Sería una opción mejor crear un controlador distinto solo para tu página de inicio? Después de todo, puede que tenga que acceder a múltiples modelos y realmente no fluye bien con el conjunto, un controlador por teoría de modelos que algunas personas usan.

2) Si necesita un panel de control para varios tipos de usuarios, ¿sería un controlador de panel de control que tendría un código de conmutación dependiendo de qué usuario, o diría una acción de panel de control dentro de cada controlador por usuario? Por ejemplo, admin / dashboard, account / dashboard, etc.

3) Me parece que usar el ejemplo completo de CRUD simple funciona como un encanto al tratar de explicar los controladores, pero que una vez que superas esas funciones simples, se descompone y puede hacer que tus controladores se vuelvan difíciles de manejar. ¿Por qué algunas personas eligen crear un controlador de inicio de sesión, cuando otros hacen una función de inicio de sesión en un controlador de usuario? Creo que una de las razones es que muchos de nosotros venimos de un fondo de enfoque de página y es difícil pensar en los controladores como "objetos" o " sustantivos " porque las páginas no siempre funcionan así. Caso en cuestión, ¿por qué motivo querría crear una " páginas " controlador que manejaría páginas que realmente no tienen nada que ver entre sí solo para tener un " contenedor " para encajar acciones en. Simplemente no me parece correcto.

4) Si los controladores tienen más que ver con un caso de uso que con un " objeto " que las acciones se pueden realizar en? Para todos los fines intensivos, puede crear un controlador de usuario que realice todas las acciones en toda la aplicación. O puede crear un controlador por " área de interés " como a algunos les gusta decir. O puede crear un controlador por vista si lo desea. Hay tanto margen de maniobra que hace que sea difícil descubrir un método consistente para usar.

Los controladores no deberían ser tan confusos, pero por alguna razón me desconciertan. Cualquier comentario útil sería muy apreciado.

¿Fue útil?

Solución

1) Utilizo un conjunto de clases homebrew simple para algunas de mis cosas de MVC, y relaciona los nombres de los controladores con los de acción y visualización (es un estilo de Front Controller, similar a Zend). Para un sitio web genérico, supongamos que tiene una página de inicio, una política de privacidad, una página de contacto y una página de información. Realmente no quiero hacer controladores separados para todas estas cosas, así que los pegaré dentro de mi IndexController , con nombres de funciones como actionIndex () , actionPrivacy () , actionContact () y actionAbout () .

Para estar de acuerdo con eso, dentro de mi directorio de Vistas tengo un directorio de plantillas asociado con cada acción. De forma predeterminada, cualquier acción busca automáticamente una plantilla asociada, aunque puede especificar una si lo desea. Por lo tanto, actionPrivacy () buscará un archivo de plantilla en index / privacy.php , actionContact () buscará index / contact .php , etc.

Por supuesto, esto también se relaciona con las URL. Por lo tanto, un url al http://www.example.com/index/about ejecutaría actionAbout () , que cargaría la plantilla de la página Acerca de. Dado que la página sobre es contenido completamente estático, mi actionAbout () no hace absolutamente nada, aparte de proporcionar una acción pública para que el controlador frontal lo vea y ejecute.

Para responder al núcleo de su pregunta, coloco varias páginas " " " en un solo controlador, y funciona bien para mis propósitos. Un modelo por controlador es una teoría que no creo que intente seguir al trabajar con Web MVC, ya que parece que se ajusta mucho mejor a una aplicación.

2) Para esto, tendría varios controladores. Siguiendo los mismos métodos que utilizo anteriormente, tendría / admin / dashboard y / account / dashboard como sugieres, aunque no hay razón para que no puedan usar el mismo ( o partes de las mismas) plantillas.

Supongo que si tuviera millones de usuarios diferentes, haría las cosas más genéricas y solo usaría un controlador, y tendría una regla mod_rewrite para manejar la carga. Probablemente dependería de qué tan funcional sea el tablero de mandos y de la configuración de la cuenta.

3) Me parece que la funcionalidad de CRUD es difícil de implementar directamente en cualquier capa de MVC y aún así es limpia, flexible y eficiente. Me gusta abstraer la funcionalidad de CRUD en una capa de servicio a la que puede recurrir cualquier objeto, y tener una clase de objeto base desde la cual puedo extender cualquier objeto que necesite CRUD.

Sugeriría utilizar algunos de los frameworks ORM de PHP para CRUD. Pueden eliminar muchas de las molestias de obtener una buena implementación.

En términos de controlador de inicio de sesión versus controlador de usuario, supongo que depende de su dominio de aplicación. Con mi estilo de programación, tiendo a pensar en " iniciar sesión " como una operación simple dentro del dominio de un modelo de Usuario, y por lo tanto tiene una sola operación para él dentro de un controlador de usuario. Para ser más precisos, tendría el UserController instanciar un modelo de usuario y llamar a una rutina de inicio de sesión en el modelo. No puedo decirles que esta es la forma correcta, porque no podría decir con seguridad cuál es la forma correcta que se supone que es. Es una cuestión de contexto.

4) Tienes razón sobre el margen de maniobra. Puede crear fácilmente un controlador que maneje todo lo que su aplicación / sitio deseaba hacer. Sin embargo, creo que estaría de acuerdo en que esto se convertiría en una pesadilla de mantenimiento. Sigo teniendo los jibbly-jibblies pensando en mi último trabajo en una empresa de investigación de mercado, donde la aplicación interna de PHP fue realizada por un equipo en el extranjero con lo que solo puedo suponer que fue poca o ninguna capacitación. Estamos hablando de guiones de 10,000 líneas que manejaron todo el sitio. Era imposible de mantener.

Por lo tanto, le sugiero que divida su aplicación / sitio en áreas de dominio de negocios y cree controladores basados ??en eso. Determine los conceptos básicos de su aplicación y vaya desde allí.

Ejemplo

Digamos que tenía un sitio web sobre manatíes, porque obviamente los manatíes son una roca. Me gustaría algunas páginas normales del sitio (acerca de, contactos, etc.), administración de cuentas de usuarios, un foro, una galería de imágenes y, tal vez, un área de material de documentos de investigación (con la última ciencia sobre manatíes). Bastante simple, y mucho de esto sería estático, pero puedes comenzar a ver el desglose.

IndexController : maneja la página, la política de privacidad, el contenido estático genérico.

UserController : maneja la creación de la cuenta, el inicio / cierre de sesión, las preferencias

PictureController : muestra imágenes, maneja subidas

ForumController - probablemente no mucho, trataría de integrar un foro externo, lo que significaría que no necesitaría mucha funcionalidad aquí.

LibraryController : muestra listas de noticias e investigaciones recientes

HugAManateeController - abrazo de manatí virtual en tiempo real sobre HTTP

Eso probablemente te da al menos una separación básica. Si encuentra que un controlador se está volviendo extremadamente grande, es probable que sea el momento de dividir el dominio empresarial en controladores separados.

Será diferente para cada proyecto, por lo que un poco de planificación ayudará en gran medida hacia el tipo de estructura arquitectónica que tendrá.

Web MVC puede ser muy subjetivo, ya que es bastante diferente de un modelo MVC donde su aplicación tiene un estado. Intento mantener las principales funciones fuera de los controladores cuando se trata de aplicaciones web. Me gusta que ejemplifiquen algunos objetos o modelos, ejecuten un par de métodos basados ??en la acción que se está realizando y recopilen algunos datos de Vista para transmitirlos a la Vista una vez que se haya realizado. Cuanto más simple, mejor, y coloco la lógica de negocios central en los modelos, que se supone que son representativos del estado de la aplicación.

Espero que ayude.

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