Patrón Repositorio (Repository Pattern)

Hola estimado foro, buenas tardes (aquí en Argentina).

Consulto porque solo hay información en inglés al respecto pero no hay mucho para Yii2.

Alguien se vio con la necesidad de aplicar el patrón de diseño repositorio?

Pregunto porque mi idea es separar un poco la lógica de los modelos que genero con gii, active record, y luego los CRUDS, ya que me encuentro con algunos métodos que nada tienen que ver con el acceso a los datos, sino son más lógica de negocios o decisiones del dominio.

Hay muchísima información al respecto, de hecho en la documentación de Yii2 dice que es sugerencia mantener controladores flacos y modelos gordos, pero también dice que es extensible y que es posible manejar la estructura de la aplicación como uno lo desee y combinar técnicas de diseño.

Mi idea es no caer en el sobre análisis pero tampoco mezclar peras con bananas, hablando en criollo. Por lo cual métodos que sean para representar fechas de la entidad, o subida de imagenes relacionadas, o seteo de domicilios y datos de contacto en tablas relacionadas, no se si se deben alojar en el mismo modelo active record.

He pensado utilizar interfaces y luego repositorios de clase que puedan implementarlas para luego inyectar vía constructor el modelo active record y así desacoplar un poco las dependencias. Para ello en el controlador me debería quedar menos cantidad de código y en los modelos active record me queden solo los datos y validaciones, comportamientos y eventos específicos a esa entidad.

Es más un tema de diseño y concepto que busco interactuar con colegas que hayan pasado por lo mismo.

He intercambiado con Alexander en el foro de ingles, y me comento que puedo utlizar el DI container para las dependencias y alguna clase repositorio para apoyarme, pero no se si esto lo debo hacer ya que sería un patrón de diseño en cada una de las entidades o solo en las que sea necesario y fundamentalmente si ES REALMENTE NECESARIO.

Estoy mareado, perdón. Saludos a todos!!!

Hola!

Honestamente todos los patrones de diseño te llevan a que la lógica de tu aplicación debe estar concentrada en tus Modelos (que no implícitamente debe ser una tabla de la BD), por tanto tus controladores no deberían estar muy recargados.

Respecto a seguir la moda de Laravel, Symfony me parece que Yii3 dejará de ser lo que era además que sus tiempos de desarrollo han sido tétricos, fijate Django mantiene su principio incluso en su versión 3 y para mi Yii era el Django de PHP, por tanto todo este concepto de desacoplamiento era algo que ya existía, para ello se habían creado los Behaviors & Filters principalmente, además que de acuerdo a los requisitos los desarrolladores deberían crear componentes, widgets y/o extensiones.

No creo debas complicarte, solo intenta es desagregar bien lo que deseas hacer y definir tuy organización, la programación no es algo del otro mundo o innovador solo que algunos proyectos públicos o privados le ponen una marca e intentan definir un estandar cuando los buenos programadores ya venían haciéndolo y entonces cambian totalmente el core y …

Espero haberte sido de utilidad y genial te intereses en este tema, pues muchos solo se dedican a copiar pegar y escribir código sin interesarse en como se escribe, lo cual importante demasiado a nivel profesional, ejemplo: puedes escribir palabras en una hoja en blanco para narrar algo, pero puedes hacerlo como se debe y tener una excelente novela :wink:

Saludos.

Hola Rafael! Primero muchas gracias por tu respuesta y tus definiciones.

Me gustaría entender sobre lo que mencionas sobre Yii3, dices que no será tan bueno como Yii2? Sinceramente creo que Yii2 es un framework extremadamente potente, le encuentro muchísimas herramientas modernas y útiles, y con un poco de creatividad haces una REST API y lo consumes desde un móvil, como así también hacer sistemas modulares escalables implementados en servidores dedicados locales o remotos y hacer cuestiones bien complejas, como dices con filtros, behaviors, components, etc…

Django ya que lo menciones es una gran cuenta pendiente, ya que Python es un lenguaje que siempre me gustó, pero como siempre me han salido trabajos en PHP y Js en su mayoría, me he apoyado varios proyectos en Yii2. No encuentro en Laravel nada que Yii2 no tenga, de hecho me parece que resuelve mejor muchas cosas, Symfony me parece un poco más complicado de utilizar, pero si que es interesante. La simpleza de Yii2, con sus herramientas me facilitan el trabajo del día a día.

Ahora volviendo al punto, si creo que no tengo que complicarme, porque muchos mezclan 3 o 4 patrones dentro de un mismo desarrollo, y es como querer volcar todos los libros en un trabajo.

Mi idea es poder separar de un modelo active record, que termina siendo una entidad de mi sistema, lo que podría ser lógica de negocios, aunque es contradictorio con la documentación oficial de Yii2 donde dice que se debe empujar la lógica a los modelos, y tener controladores flacos y modelos gordos. Si creo en el principio de responsabilidad única, es por eso que si por ejemplo mi entidad Customer, guarda datos de contacto por ejemplo algo como setAddresses, setPhones, setEmails, son métodos que tienen cierto algoritmo de comprobación primero y luego guardado en tablas intermedias, como puede ser customer_address, customer_phone, customer_email, donde es una relación muchos a muchos. Siempre permito 3 contactos por cada entidad. Luego esto se repite para la entidad Supplier, y para la entidad Affiliate, entonces son 3 métodos que no son propios de una sola entidad, es allí cuando pienso opciones para no repetirme a mi mismo, y digo, hago una interfaz que sea iDataContact con 3 métodos como los mencionados, y que la implementación la hagan los modelos en active record, o bien la otra opción es hacer una clase repositorio de cada una de las entidades, por ejemplo CustomerRepository y que implemente la interfaz mencionada, e inyectarle a través de constructor el modelo active record dentro del controlador y toda la lógica se haga allí.

Bueno, son en esos dilemas que entro, si puedes darme tu opinión sería genial, nuevamente.

Con respecto al patrón repositorio, sinceramente no me queda claro como implementarlo en yii2, toda la info que hay es sobre java más que nada, y lo que vi en php cada uno lo hace a su manera…

Aguardo tu comentario, y te super agradezco, saludos!