Disons que chaque fois que je fais une opération CRUD ou que je modifie une relation d'une manière spécifique, je veux aussi faire autre chose. Par exemple, chaque fois que quelqu'un publie un article, je souhaite également enregistrer quelque chose dans une table à des fins d'analyse. Peut-être pas le meilleur exemple, mais en général, il y a beaucoup de cette fonctionnalité "groupée".
Normalement, je vois ce type de logique mis dans les contrôleurs. C'est très bien jusqu'à ce que vous souhaitiez reproduire cette fonctionnalité dans de nombreux endroits. Lorsque vous commencez à entrer dans les partiels, à créer une API et à générer du contenu factice, il devient difficile de garder les choses au sec.
Les façons dont j'ai vu pour gérer cela sont les événements, les référentiels, les bibliothèques et l'ajout aux modèles. Voici ma compréhension de chacun:
Services: c'est là que la plupart des gens mettront probablement ce code. Mon principal problème avec les services est qu'il est parfois difficile d'y trouver des fonctionnalités spécifiques et j'ai l'impression qu'ils sont oubliés lorsque les gens se concentrent sur l'utilisation d'Eloquent. Comment saurais-je que j'ai besoin d'appeler une méthode publishPost()
dans une bibliothèque alors que je peux simplement le faire $post->is_published = 1
?
La seule condition dans laquelle je vois que cela fonctionne bien est si vous utilisez UNIQUEMENT des services (et si vous rendez Eloquent inaccessible d'une manière ou d'une autre à tous les contrôleurs).
En fin de compte, il semble que cela ne ferait que créer un tas de fichiers supplémentaires inutiles si vos demandes suivent généralement la structure de votre modèle.
Référentiels: d' après ce que je comprends, c'est fondamentalement comme un service mais il y a une interface pour que vous puissiez basculer entre les ORM, dont je n'ai pas besoin.
Evénements: Je vois cela comme le système le plus élégant dans un sens parce que vous savez que les événements de votre modèle seront toujours appelés sur des méthodes Eloquent, vous pouvez donc écrire vos contrôleurs comme vous le feriez normalement. Je peux cependant voir que cela devient compliqué et si quelqu'un a des exemples de grands projets utilisant des événements pour un couplage critique, j'aimerais le voir.
Modèles: Traditionnellement, j'avais des classes qui exécutaient CRUD et géraient également le couplage critique. Cela a en fait facilité les choses car vous saviez que toutes les fonctionnalités autour de CRUD +, tout ce qui devait être fait, était là.
Simple, mais dans l'architecture MVC, ce n'est normalement pas ce que je vois faire. Dans un sens, je préfère cela aux services car c'est un peu plus facile à trouver et il y a moins de fichiers à suivre. Cela peut cependant devenir un peu désorganisé. J'aimerais entendre les inconvénients de cette méthode et pourquoi la plupart des gens ne semblent pas le faire.
Quels sont les avantages / inconvénients de chaque méthode? Est-ce que je manque quelque chose?