Digamos que cada vez que hago una operación CRUD o modifico una relación de una manera específica, también quiero hacer otra cosa. Por ejemplo, cada vez que alguien publica una publicación, también quiero guardar algo en una tabla para análisis. Quizás no sea el mejor ejemplo, pero en general hay mucha de esta funcionalidad "agrupada".
Normalmente veo este tipo de lógica en los controladores. Eso está muy bien hasta que quieras reproducir esta funcionalidad en muchos lugares. Cuando comienzas a entrar en parciales, crear una API y generar contenido ficticio, se convierte en un problema para mantener las cosas SECAS.
Las formas en que he visto administrar esto son eventos, repositorios, bibliotecas y agregar a modelos. Aquí están mis entendimientos de cada uno:
Servicios: aquí es donde la mayoría de las personas probablemente pondrían este código. Mi principal problema con los servicios es que a veces es difícil encontrar una funcionalidad específica en ellos y siento que se olvidan cuando las personas se centran en usar Eloquent. ¿Cómo sabría que necesito llamar a un método publishPost()
en una biblioteca cuando puedo hacerlo $post->is_published = 1
?
La única condición en la que veo que esto funciona bien es si SOLO usa los servicios (e idealmente hace que Eloquent sea inaccesible de alguna manera desde todos los controladores).
En última instancia, parece que esto solo crearía un montón de archivos innecesarios adicionales si sus solicitudes generalmente siguen la estructura de su modelo.
Repositorios: por lo que entiendo, esto es básicamente como un servicio, pero hay una interfaz para que pueda cambiar entre ORM, que no necesito.
Eventos: veo esto como el sistema más elegante en cierto sentido porque sabe que los eventos de su modelo siempre se llamarán con métodos Eloquent, por lo que puede escribir sus controladores como lo haría normalmente. Sin embargo, puedo ver que estos se vuelven desordenados y si alguien tiene ejemplos de proyectos grandes que usan eventos para el acoplamiento crítico, me gustaría verlo.
Modelos: Tradicionalmente, tenía clases que realizaban CRUD y también manejaban el acoplamiento crítico. Esto realmente facilitó las cosas porque sabía que todas las funcionalidades relacionadas con CRUD +, lo que sea que tuviera que hacer con él, estaban allí.
Simple, pero en la arquitectura MVC esto normalmente no es lo que veo hecho. En cierto sentido, prefiero esto a los servicios, ya que es un poco más fácil de encontrar y hay menos archivos de los que hacer un seguimiento. Sin embargo, puede ser un poco desorganizado. Me gustaría escuchar las desventajas de este método y por qué la mayoría de las personas no parecen hacerlo.
¿Cuáles son las ventajas / desventajas de cada método? ¿Me estoy perdiendo de algo?