Tengo una aplicación MVC escrita con Zend Framework que extrae datos de una base de datos Oracle 10g y muestra estos datos en tablas y listas y enriquece visualmente estos datos a través de colores y gráficos. No hay ORM ni Create, Update o Delete involucrados, solo lectura pura. Los datos se insertan desde otra aplicación. Los datos en la base de datos se modelan según los conceptos que representan y a los que acceden las vistas de base de datos que agregan estos datos de otras tablas (heredado, no puede cambiar), p.¿Cómo modelarías esta aplicación?
| Event ID | Start | End | Status | Created_By |
-----------------------------------------------------------------------------
| 12345678 | 2009-10-01 12:00:00 | 2009-10-01 12:15:00 | booked | John Doe |
| 12345679 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | booked | John Doe |
| 12345680 | 2009-11-01 13:00:00 | 2009-12-01 12:00:00 | tba | Jane Doe |
Los usuarios pueden influir en la visualización de la columna, ordenando y ordenando desde la Vista. Los clientes pueden denegar/permitir el acceso a columnas y limitar el contenido de la columna a ciertos valores. Los usuarios no pueden anular la configuración del cliente. Un usuario es un actor, mientras que un cliente es básicamente un filtro que crea un subconjunto de datos disponibles para un usuario que pertenece al cliente. La configuración del usuario y del cliente se conserva.
Mi enfoque actual funciona más o menos así:
Request --> Controller
| <--> sanitizes and returns Request params
| ---> Facade (capsules steps to fetch View Data)
| | <--> Table Data Gateway builds Query for requested View
| | <--> Query Decorator¹ applies User/Client settings
| | <--> DB Adapter fetches RecordSet from decorated Query
| <----returns Recordset
| <--> applies RecordSet to View
| <--> Data-Aware ViewHelper render RecordSet (and View)
Response <--returns rendered View
¹
El decorador de consulta puede leer en la configuración persistió usuario/cliente y añadirlo al objeto de consulta de base devuelto por el TDG sobre la marcha.
Sin embargo, últimamente he dudado de este enfoque y quiero mejorarlo. Supongo que podría eliminar los TDG por completo y hacer que View sea completamente genérico desde la interfaz de usuario; basado solo en la estructura de DB. A los usuarios ciertamente les gustaría esto. El caso es que la Vista debe saber mucho sobre los datos. Los ViewHelpers deben conocer los nombres de las columnas para enriquecer los datos y, a menudo, lo hacen con respecto a las columnas múltiples en los Recordsets. No pueden ser genéricos y algo me dice que esto es un problema de todos modos. Se siente como una mezcolanza. Simplemente no puedo precisar por qué.
Todos los patrones, ideas y opiniones son muy apreciados. Sé que la pregunta es algo vaga, pero como dije, no puedo precisar qué es lo que me hace dudar de este enfoque. Así que supongo que estoy buscando enfoques de buenas prácticas para construir aplicaciones centradas en bases de datos personalizables para usuarios y clientes de una manera sostenible. Ciertamente no necesito una solución, solo algunas ideas y tal vez algunos enlaces para ver cómo otras personas abordan este problema, por lo que puedo tenerlo en cuenta en la próxima refactorización.
Nota
Voy a dejar la pregunta abierta para la duración completa antes de aceptar una respuesta. Cualquier entrada es apreciada.
Por favor, perdona mi escepticismo, pero: La vista necesita saber mucho acerca de los datos? ¿Los ViewHelpers deben saber los nombres de las columnas? * ¿Por qué? * Esto casi suena como un efecto de plataforma interna, una reinvención de Microsoft Access o Cognos. La personalización más allá de un cierto umbral es malvada; podrían ser los * requisitos * los que necesitan una refactorización. – Aaronaught
@Aaronaught El escepticismo está bien. Es lo que me hizo formular esta pregunta :) Para responder la tuya: imagina que hay un ViewHelper que representa una Barra de línea de tiempo basada en * Inicio *, * Fin * y * Estado * como parte de una tabla que representa un conjunto de registros completo además de un ViewHelper que rinde un PieChart basado en * Created_By *. – Gordon