Nehmen wir an, wenn ich eine CRUD-Operation durchführe oder eine Beziehung auf eine bestimmte Weise ändere, möchte ich auch etwas anderes tun. Wenn beispielsweise jemand einen Beitrag veröffentlicht, möchte ich auch etwas für die Analyse in einer Tabelle speichern. Vielleicht nicht das beste Beispiel, aber im Allgemeinen gibt es viele dieser "gruppierten" Funktionen.
Normalerweise sehe ich diese Art von Logik in Controllern. Das ist alles in Ordnung, bis Sie diese Funktionalität an vielen Stellen reproduzieren möchten. Wenn Sie anfangen, Partials zu erstellen, eine API zu erstellen und Dummy-Inhalte zu generieren, wird es zu einem Problem, die Dinge trocken zu halten.
Die Möglichkeiten, wie ich dies verwalten kann, sind Ereignisse, Repositorys, Bibliotheken und das Hinzufügen zu Modellen. Hier sind meine Erkenntnisse von jedem:
Dienste: Hier würden die meisten Leute diesen Code wahrscheinlich einfügen. Mein Hauptproblem bei Diensten ist, dass es manchmal schwierig ist, bestimmte Funktionen in ihnen zu finden, und ich habe das Gefühl, dass sie vergessen werden, wenn sich die Leute auf die Verwendung von Eloquent konzentrieren. Woher weiß ich, dass ich eine Methode publishPost()
in einer Bibliothek aufrufen muss, wenn ich das nur kann $post->is_published = 1
?
Die einzige Bedingung, unter der dies gut funktioniert, ist, wenn Sie NUR Dienste verwenden (und Eloquent im Idealfall von Controllern insgesamt irgendwie unzugänglich machen).
Letztendlich scheint dies nur eine Reihe zusätzlicher unnötiger Dateien zu erzeugen, wenn Ihre Anforderungen im Allgemeinen Ihrer Modellstruktur folgen.
Repositories: Soweit ich weiß, ist dies im Grunde genommen wie ein Dienst, aber es gibt eine Schnittstelle, über die Sie zwischen ORMs wechseln können, die ich nicht benötige.
Ereignisse: Ich sehe dies in gewisser Hinsicht als das eleganteste System, da Sie wissen, dass Ihre Modellereignisse immer mit eloquenten Methoden aufgerufen werden, sodass Sie Ihre Controller so schreiben können, wie Sie es normalerweise tun würden. Ich kann sehen, dass diese unordentlich werden, und wenn jemand Beispiele für große Projekte hat, die Ereignisse für die kritische Kopplung verwenden, würde ich es gerne sehen.
Modelle: Traditionell hatte ich Klassen, die CRUD durchführten und auch die kritische Kopplung handhabten. Dies machte die Sache tatsächlich einfach, da Sie wussten, dass alle Funktionen rund um CRUD +, was auch immer damit getan werden musste, vorhanden waren.
Einfach, aber in der MVC-Architektur ist dies normalerweise nicht das, was ich getan sehe. In gewissem Sinne bevorzuge ich dies jedoch gegenüber Diensten, da es etwas einfacher zu finden ist und weniger Dateien zu verfolgen sind. Es kann allerdings etwas unorganisiert werden. Ich würde gerne die Nachteile dieser Methode hören und warum die meisten Leute es nicht zu tun scheinen.
Was sind die Vor- und Nachteile jeder Methode? Vermisse ich etwas