Dieser Artikel führt Sie hauptsächlich in die relevanten Informationen zur Verwendung von Aktionsklassen in Designideen für Laravel-Programme ein Brauchen Sie es? Lassen Sie uns gemeinsam mit dem Herausgeber unten lernen
Vorwort
Wenn wir über die Architektur von Anwendungen sprechen, fragen wir oft Komm zu einem Klassiker Frage, die lautet: „Wo soll dieser Code platziert werden?“ Da Laravel ein recht flexibles Framework ist, ist es nicht so einfach, diese Frage zu beantworten. Soll ich meine Geschäftslogik in der Modellebene, der Controller-Ebene oder woanders schreiben?
Wenn Ihre Anwendung nur einen Zugriffspunkt hat, ist es in Ordnung, Geschäftslogik in der Controller-Ebene zu schreiben. Heutzutage kommt es jedoch häufiger vor, dass es viele Zugriffspunkte gibt, um denselben Funktionsbaustein aufzurufen.
Viele Anwendungen verfügen beispielsweise über die Funktion der Benutzerregistrierung. Der Prozess besteht darin, einen Controller aufzurufen und dann eine Ansicht zurückzugeben, die angibt, ob die Registrierung erfolgreich war oder fehlgeschlagen ist. Wenn diese Anwendung auch über eine mobile Version verfügt, stellt sie wahrscheinlich eine Reihe von APIs für die Registrierung mobiler Benutzer bereit, da das Datenformat, das sie zurückgeben muss, JSON ist. Und es ist auch sehr üblich, den handwerklichen Befehl von Laravel zum Erstellen von Benutzern zu verwenden, insbesondere in der frühen Entwicklungsphase des Projekts.
Die beiden oben genannten Codeteile scheinen keine Probleme zu haben, aber mit zunehmender Geschäftslogik erscheint der Code sehr redundant. Wenn Sie beispielsweise die Funktion zum Senden von E-Mail-Benachrichtigungen an Benutzer nach der Registrierung neuer Benutzer hinzufügen müssen, müssen Sie den Code zum Senden von E-Mails an beide oben genannten Controller hinzufügen. Wenn wir den Code jedoch einfach und elegant halten möchten, können wir diese Geschäftslogik an anderer Stelle schreiben.
Auf die Frage „Wo soll der Geschäftslogikcode geschrieben werden“ erhalten Sie in jedem Forum eine allgemeine Antwort: „Verwenden Sie eine Serviceschicht und rufen Sie diese Serviceklasse dann in der Controllerschicht auf.“ . Ja, das stimmt, die Frage ist, wie sollen wir die Serviceklasse gestalten? Soll eine UserService-Klasse erstellt werden, um die gesamte benutzerbezogene Geschäftslogik zu implementieren, und diese Klasse dann in die Controller-Ebene eingefügt werden, die verwendet werden muss? Oder gibt es andere Möglichkeiten?
Vermeiden Sie die Fallstricke göttlicher Klassen
Zunächst können Sie versuchen, eine einzelne Klasse für ein bestimmtes Modell zu erstellen, die den gesamten Code enthält. Zum Beispiel:
sieht perfekt aus: Wir können Create/Delete-Methoden in jedem Controller deklarieren oder verwenden und erhalten die gewünschten Ergebnisse. Aber was ist an dieser Implementierung falsch? Das heißt, wir verwenden bei der Lösung von Problemen selten ein einzelnes Modell.
Wenn wir beispielsweise ein Konto für einen Benutzer erstellen, müssen wir gleichzeitig auch einen separaten Blog für den Benutzer erstellen. Wenn wir diesen Prozess auf die aktuelle Art und Weise implementieren, müssen wir eine BlogService-Klasse erstellen und dann deren Abhängigkeiten in die UserService-Klasse einfügen.
Mit zunehmendem Anwendungsgeschäft wird es natürlich Dutzende bis Hunderte von Serviceklassen geben, von denen einige auf 5 bis 6 andere Serviceklassen angewiesen sind. Das Endergebnis ist Code-Redundanz und Chaos, und diese Situation wollen wir um jeden Preis vermeiden.
Einführung der Single-Action-Klasse
Anstatt also eine einzelne Serviceklasse mit mehreren Methoden zu verwenden, haben wir beschlossen, sie in mehrere A Kategorie? Das Folgende ist die Methode, die ich in jedem aktuellen Projekt verwendet habe. Die Ergebnisse sind sehr gut und ich kann sie jedem empfehlen.
Lassen Sie uns zunächst die allzu allgemeine und vage Service-Terminologie hinter uns lassen und einen Blick auf unsere neuen Aktionsklassen werfen und definieren, was sie sind und was sie tun können.
Eine Aktionsklasse sollte einen Namen haben, der ihre Funktion beschreibt, wie zum Beispiel: CreateOrder, ConfirmCheckout, DeleteProduct, AddProductToCart usw.
Es sollte eine und nur eine öffentliche Methode als API haben. Idealerweise sollte es derselbe Methodenname sein, z. B. handle() oderexecute() . Dies ist sehr praktisch, wenn wir eine Art Adaptermuster für unsere Aktionsklassen implementieren müssen.
Es muss unabhängig von Anfrage und Antwort sein. Es werden keine Anfragen bearbeitet und keine Antworten gesendet. Diese Verantwortung sollte beim Verantwortlichen liegen.
Es kann von anderen Aktionsklassen abhängen.
Wenn irgendetwas die Ausführung und/oder Rückgabe des erwarteten Werts verhindert, muss es die entsprechende Geschäftslogik durchsetzen, indem es eine Ausnahme auslöst und den Aufrufer (oder Laravel ExceptionHandler) die Verantwortung übernehmen lässt Informationen zum Präsentieren/Reagieren auf Ausnahmen.
Erstellen Sie unsere CreateUser-Aktionsklasse
Nehmen wir nun das vorherige Beispiel und überarbeiten es mit einer einzelnen Aktionsklasse, die wir CreateUser nennen.
Sie fragen sich vielleicht, warum diese Methode eine Ausnahme auslöst, wenn die E-Mail-Adresse bereits belegt ist. Wird dies nicht durch die Anforderung einer Verifizierung gewährleistet? Sicher. Wäre es jedoch nicht besser, die Geschäftslogik innerhalb der Aktionsklasse auszuführen? Dadurch ist die Logik leichter zu verstehen und zu debuggen.
Schauen wir uns den Controller-Code nach Verwendung unserer Aktionsklasse wie folgt an:
Nun, egal welche Änderungen wir vornehmen, der Benutzer Register Der Prozess wird von API- und Webversionen elegant und sauber abgewickelt.
Verschachtelung von Aktionsklassen
Angenommen, wir benötigen eine Aktionsklasse, um 1000 Benutzer in unsere Anwendung zu importieren. Wir können eine Aktionsklasse schreiben und weiterhin die CreateUser-Klasse von oben verwenden:
Ziemlich nett, nicht wahr? Wir können den CreateUser-Code wiederverwenden, indem wir ihn in die Methode Collection::map() einbetten, die dann eine Sammlung aller neu erstellten Benutzer zurückgibt. Wenn die E-Mail belegt ist, können wir ein Null-Objekt zurückgeben oder es in der Protokolldatei aufzeichnen. Daran sollten Sie bereits gedacht haben.
Action-Klassendekoration
Angenommen, wir möchten jeden neu registrierten Benutzer im Protokoll aufzeichnen. Wir können den Code innerhalb der Aktionsklasse schreiben oder das Dekoratormuster verwenden.
Wir können dann den IoC-Container von Laravel verwenden, um die LogCreateUser-Klasse an die CreateUser-Klasse zu binden, sodass immer dann, wenn wir eine Instanz der letzteren benötigen, erstere injiziert wird:
AppServiceProvider.php
Dadurch lässt sich die Aktivierung oder Deaktivierung der Protokollierungsfunktion bequemer mithilfe von Konfigurations- oder Umgebungsvariablen steuern:
AppServiceProvider.php
Zusammenfassung
Die Verwendung dieser Methode scheint viele Klassen zu erfordern. Natürlich ist die Benutzerregistrierung nur ein einfaches Beispiel, das darauf ausgelegt ist, den Code kurz und klar zu halten. Sobald die Komplexität des Projekts zunimmt, wird der wahre Wert von Aktionsklassen immer offensichtlicher, da Sie genau wissen, wo sich der Code befindet und welche Grenzen er hat.
Vorteile der Verwendung von Einzelaktionsklassen:
Eine kleine und einzelne logische Domäne kann Codeduplizierung verhindern und die Wiederverwendbarkeit von Code verbessern, wodurch die Stabilität erhalten bleibt.
Einfache unabhängige Tests für verschiedene Szenarien.
Aussagekräftige Namen sind in großen Projekten leichter zu lesen.
Einfach zu dekorieren.
Konsistenz im gesamten Projekt: Verhindern Sie, dass Code über Controller, Modelle usw. verteilt wird.
Natürlich basiert diese Methode auf einigen meiner Erfahrungen mit Laravel in den letzten Jahren und meiner Praxis in einigen Projekten. Das hat bei mir wirklich gut funktioniert und jetzt verwende ich es sogar bei einigen kleinen bis mittleren Projekten.
Wenn Sie einen anderen Ansatz haben, würde ich mich sehr darauf freuen, es zu lesen.
Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.
Verwandte Empfehlungen:
Das obige ist der detaillierte Inhalt vonDie Verwendung von Aktionsklassen beim Entwurf der Laravel-Programmierarchitektur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!