Ich baue eine Laravel-App mit verschiedenen Funktionen. Ich möchte sie je nach Anforderung einer bestimmten Domain aktivieren oder deaktivieren können. Derzeit habe ich in meiner Konfiguration eine Reihe von Flags wie:
'is_feature_1_enabled' => true,
'is_feature_2_enabled' => false,
... und so weiter.
Dann überprüfe ich in meinen Controllern und Ansichten diese Konfigurationswerte, um festzustellen, ob ich etwas anzeigen soll, bestimmte Aktionen zulasse usw. Meine App wird überall mit solchen Überprüfungen verschmutzt.
Gibt es eine Best-Practice-Methode zum Verwalten von Funktionen in einer Laravel-App?
laravel
laravel-5
design-patterns
laravel-4
StackOverflowNewbie
quelle
quelle
Antworten:
Dies wird technisch als Feature-Flags bezeichnet - https://martinfowler.com/articles/feature-toggles.html
hängt von Ihren Anforderungen, Flags in Konfiguration / Datenbank, Rollout usw. ab.
Aber es ist im Grunde genommen, wenn es im Code ist und nicht sauber sein kann.
Laravel-Pakete:
https://github.com/alfred-nutile-inc/laravel-feature-flag
https://github.com/francescomalatesta/laravel-feature
Einige Dienstleistungen:
https://launchdarkly.com/
https://bullet-train.io/
https://configcat.com/
Das Frontend finden Sie auch unter https://marketingplatform.google.com/about/optimize/ .
quelle
Ich habe das gleiche Problem festgestellt, als ich versucht habe, mehrere Hotelanbieter zu implementieren.
Ich habe einen Servicecontainer verwendet.
Zuerst erstellen Sie eine Klasse für jede Domain. Mit seinen Funktionen:
Dann verwenden Sie die Bindung in Ihrem App-Dienstanbieter, um die Domain mit der zu verwendenden Klasse zu binden.
Beachten Sie, dass Sie eine allgemeine Klasse verwenden können, die die Funktionen für alle Domänen enthält. Verwenden Sie dann diese allgemeine Klasse in Ihren Klassen
Schließlich können Sie in Ihrem Controller Ihre Domain überprüfen, um dann die Klasse zu verwenden, die Sie verwenden werden
quelle
Es sieht so aus, als würden Sie Dinge basierend auf Konfigurationswerten hart codieren, um bestimmte Funktionen zu aktivieren oder zu deaktivieren. Ich empfehle Ihnen, die Dinge anhand der benannten Routen und nicht anhand des Konfigurationswerts zu steuern.
Sie haben also nicht die gleichen Bedingungen, die sich überall wiederholen und Ihren Code aufblähen. Hier ist ein Beispielcode, der Ihnen zeigt, wie Sie alle Routen abrufen können. Sie können den Namen der Routengruppe abgleichen, um ihn entsprechend Ihrer Situation weiter zu verarbeiten.
und hier ist ein Beispiel für einen Middleware-Handler, mit dem Sie überprüfen können, ob eine bestimmte Funktion aktiv ist, indem Sie sie mit dem übereinstimmen, was Sie bereits in Ihrer Datenbank gespeichert haben.
quelle
Angenommen, diese Funktionen werden nur für HTTP-Anforderungen benötigt.
Ich würde eine Standardbasisklasse
Features
mit allen Standardflags erstellen :Dann würde ich diese Klasse für jede Domäne erweitern und die für diese Domäne erforderlichen Überschreibungen festlegen:
Erstellen Sie dann eine Middleware, um die Feature-Class an den Container zu binden:
Vergessen Sie nicht, diese Middleware an Ihre Routen anzuhängen: an eine Gruppe oder für jede Route.
Danach können Sie Ihre Features-Klasse in Ihren Controllern eingeben:
quelle
Laravel ist damit großartig. Sie können Ihre Features sogar in db speichern und eine Beziehung zwischen der Domain herstellen.
Ich würde empfehlen, Gates und Richtlinien zu verwenden, um eine bessere Kontrolle über Ihre Controller und Blade-Vorlagen zu erhalten. Dies bedeutet, dass Sie die Gates aus Ihrer Datenbank registrieren oder fest codieren.
Wenn Sie beispielsweise die Funktion zum Exportieren von Produkten mit einer Schaltfläche in Ihrem System haben und diese Funktion einigen Benutzern zur Verfügung stellen möchten, können Sie Gates bei der Geschäftslogik registrieren.
Dann können Sie in den Controllern Folgendes tun
Hier ist ein Beispiel für Ihre Blade-Vorlagen:
Weitere Informationen finden Sie unter https://laravel.com/docs/5.8/authorization
quelle
Interessanter Fall haben Sie hier. Es kann interessant sein, sich eine
Feature
Schnittstelle oder eine abstrakte Klasse anzusehen , die einige Methoden enthält, die Sie im Allgemeinen benötigen.Sie könnten diese sogar in
ExecutableFeature
und aufteilenRenderableFeature
.Weiterhin könnte eine Art Fabrikklasse geschaffen werden, um das Leben leichter zu machen.
quelle
In meinem Fall habe ich eine neue Tabelle in der Datenbank erstellt, die Sie beispielsweise aufrufen können
Domains
.Fügen Sie alle spezifischen Funktionen, die in einigen Domänen angezeigt werden könnten, aber nicht in den übrigen, als Spalten für diese Tabelle als Bit für boolesche Werte hinzu. Wie, in meinem Fall
allow_multiple_bookings
,use_company_card
... was auch immer.Ziehen Sie dann in Betracht, eine Klasse
Domain
und ihr jeweiliges Repository zu erstellen , und fragen Sie einfach nach diesen Werten in Ihrem Code. Versuchen Sie dabei, diese Logik so weit wie möglich in Ihre Domäne (Ihr Modell, Ihre Anwendungsdienste usw.) zu übertragen.Zum Beispiel würde ich die Controller-Methode nicht überprüfen,
RequestBooking
ob die Domain, die eine Buchung anfordert, nur eine oder mehrere anfordern kann.Stattdessen mache ich es auf einem,
RequestBookingValidatorService
der überprüfen kann, ob das Buchungsdatum abgelaufen ist, der Benutzer eine aktivierte Kreditkarte hat, ... oder die Domain, von der diese Aktion stammt, mehr als eine Buchung anfordern darf (und wenn dies bereits der Fall ist) irgendein).Dies erhöht die Lesbarkeit, da Sie diese Entscheidung auf Ihre Anwendungsdienste übertragen haben. Außerdem stelle ich fest, dass ich, wenn ich eine neue Funktion benötige, Laravel- (oder Symfony-) Migrationen verwenden kann, um diese Funktion zur Tabelle hinzuzufügen, und sogar ihre Zeilen (Ihre Domänen) mit den Werten aktualisieren kann, die ich für dasselbe Commit möchte, das ich codiert habe.
quelle