Je crée une application Laravel, qui a un certain nombre de fonctionnalités différentes. Je veux pouvoir les activer ou les désactiver en fonction des besoins d'un domaine particulier. Actuellement, j'ai dans ma configuration une série de drapeaux tels que:
'is_feature_1_enabled' => true,
'is_feature_2_enabled' => false,
... etc.
Ensuite, dans mes contrôleurs et mes vues, je vérifie ces valeurs de configuration pour voir si je dois ou non afficher quelque chose, autoriser certaines actions, etc. Mon application commence à être polluée par ce type de contrôles partout.
Existe-t-il une meilleure méthode de gestion des fonctionnalités dans une application Laravel?
laravel
laravel-5
design-patterns
laravel-4
StackOverflowNewbie
la source
la source
Réponses:
Ceci est techniquement appelé indicateurs de fonctionnalité - https://martinfowler.com/articles/feature-toggles.html
dépend de vos besoins, drapeaux dans config / base de données, déploiement, etc ...
Mais c'est fondamentalement si c'est dans le code et ne peut pas être propre.
Forfaits Laravel:
https://github.com/alfred-nutile-inc/laravel-feature-flag
https://github.com/francescomalatesta/laravel-feature
Quelques services:
https://launchdarkly.com/
https://bullet-train.io/
https://configcat.com/
Regardez également https://marketingplatform.google.com/about/optimize/ pour le frontend.
la source
J'ai rencontré le même problème lorsque j'ai essayé de mettre en œuvre plusieurs fournisseurs d'hôtels.
Ce que j'ai fait, c'est utiliser un conteneur de service.
d' abord , vous allez créer la classe pour chaque domaine avec ses caractéristiques:
alors vous allez utiliser la liaison dans votre fournisseur de services d'application pour lier le domaine avec la classe à utiliser.
Notez que vous pouvez utiliser une classe générale qui contient les fonctionnalités va avec tous les domaines, puis utilisez cette classe générale dans vos classes
Enfin, dans votre contrôleur, vous pouvez vérifier votre domaine puis utiliser la classe que vous allez utiliser
la source
Il semble que vous codiez en dur sur la base des valeurs de configuration pour activer ou désactiver certaines fonctionnalités. Je vous recommande de contrôler les choses en fonction des routes nommées plutôt que de la valeur de configuration.
vous n'aurez donc pas les mêmes conditions à se répéter partout et à gonfler votre code .. voici un exemple de code vous montrant comment récupérer toutes les routes, et vous pouvez faire correspondre le nom du groupe de routes pour poursuivre le traitement en fonction de votre situation.
et voici un exemple de gestionnaire de middleware où vous pouvez vérifier si une fonctionnalité particulière est active en faisant correspondre avec ce que vous avez déjà stocké dans votre base de données.
la source
En supposant que ces fonctionnalités ne sont nécessaires que pour les requêtes HTTP.
Je créerais une
Features
classe de base par défaut avec tous les drapeaux par défaut:Ensuite, j'étendrais cette classe pour chaque domaine et définirais les remplacements nécessaires pour ce domaine:
Créez ensuite un middleware pour lier la classe d'entités au conteneur:
N'oubliez pas d'attacher ce middleware à vos itinéraires: à un groupe ou pour chaque itinéraire.
Après cela, vous pouvez taper votre classe de fonctionnalités dans vos contrôleurs:
la source
Laravel est génial avec cela, vous pouvez même stocker vos fonctionnalités dans db et créer une relation entre le domaine.
Je recommanderais d'utiliser des portes et des politiques, qui vous donneront un meilleur contrôle dans vos contrôleurs et modèles de lame. Cela signifie que vous enregistrez les portes à partir de votre base de données ou que vous les codez en dur.
Par exemple, si vous avez une fonctionnalité d'exportation de produits avec un bouton dans votre système et que vous souhaitez rendre cette fonctionnalité disponible pour certains utilisateurs, vous pouvez enregistrer des portes avec la logique métier.
Ensuite, vous pouvez effectuer les opérations suivantes dans les contrôleurs
Voici un exemple pour vos modèles de lames:
plus d'informations disponibles sur https://laravel.com/docs/5.8/authorization
la source
Cas intéressant que vous avez ici. Il peut être intéressant d'examiner une
Feature
interface ou une classe abstraite contenant quelques méthodes dont vous avez généralement besoin.Vous pourriez même les diviser en
ExecutableFeature
etRenderableFeature
.Plus loin, une sorte de classe d'usine pourrait être facilitée.
la source
Ce que j'ai fait dans mon cas était de créer une nouvelle table sur la base de données, vous pouvez l'appeler
Domains
par exemple.Ajoutez toutes les fonctionnalités spécifiques, celles qui pourraient être affichées sur certains domaines mais pas dans les autres, sous forme de colonnes pour cette table sous forme de bits pour les valeurs booléennes. Comme, dans mon cas
allow_multiple_bookings
,use_company_card
... peu importe.Ensuite, envisagez de créer une classe
Domain
et son référentiel respectif, et demandez simplement ces valeurs sur votre code, en essayant de pousser autant que possible cette logique dans votre domaine (votre modèle, les services d'application, etc.).Par exemple, je ne vérifierais pas la méthode du contrôleur pour savoir
RequestBooking
si le domaine qui demande une réservation ne peut en demander qu'un ou plusieurs.Au lieu de cela, je le fais sur un
RequestBookingValidatorService
qui peut vérifier si la date de réservation est passée, l'utilisateur a une carte de crédit activée, ... ou le domaine dont provient cette action est autorisé à demander plus d'une réservation (et puis s'il a déjà tout).Cela ajoute la commodité de la lisibilité, car vous avez poussé cette décision à vos services d'application. De plus, je trouve que chaque fois que j'ai besoin d'une nouvelle fonctionnalité, je peux utiliser les migrations Laravel (ou Symfony) pour ajouter cette fonctionnalité sur la table et je peux même mettre à jour ses lignes (vos domaines) avec les valeurs que je veux sur le même commit que j'ai codé.
la source