Tworzę aplikację Laravel, która ma wiele różnych funkcji. Chcę móc je włączać i wyłączać w zależności od wymagań konkretnej domeny. Obecnie mam w swojej konfiguracji szereg flag, takich jak:
'is_feature_1_enabled' => true,
'is_feature_2_enabled' => false,
... i tak dalej.
Następnie w moich kontrolerach i widokach sprawdzam te wartości konfiguracyjne, aby zobaczyć, czy powinienem coś wyświetlać, zezwalając na określone działania itp. Moja aplikacja zaczyna być zanieczyszczana przez tego rodzaju kontrole wszędzie.
Czy istnieje metoda najlepszych praktyk zarządzania funkcjami w aplikacji Laravel?
laravel
laravel-5
design-patterns
laravel-4
StackOverflowNewbie
źródło
źródło
Odpowiedzi:
Jest to technicznie nazywane flagami funkcji - https://martinfowler.com/articles/feature-toggles.html
zależy od twoich wymagań, flag w config / bazie danych, rollout itp.
Ale to w zasadzie jeśli jest w kodzie i nie może być czyste.
Pakiety Laravel:
https://github.com/alfred-nutile-inc/laravel-feature-flag
https://github.com/francescomalatesta/laravel-feature
Niektóre usługi:
https://launchdarkly.com/
https://bullet-train.io/
https://configcat.com/
Zobacz także https://marketingplatform.google.com/about/optimize/ for frontend.
źródło
Ten sam problem napotkałem, gdy próbowałem wdrożyć wielu dostawców hoteli.
Użyłem kontenera usług.
najpierw stworzysz klasę dla każdej domeny Dzięki jego funkcjom:
następnie użyjesz wiązania u dostawcy usług aplikacji, aby powiązać domenę z klasą do użycia.
Pamiętaj, że możesz użyć klasy ogólnej, która zawiera funkcje ze wszystkimi domenami, a następnie użyć tej klasy ogólnej w swoich klasach
Wreszcie w kontrolerze możesz sprawdzić swoją domenę, a następnie użyć klasy, z której będziesz korzystać
źródło
Wygląda na to, że kodujesz rzeczy na podstawie wartości konfiguracji, aby włączyć lub wyłączyć niektóre funkcje. Zalecam kontrolowanie rzeczy na podstawie nazwanych tras, a nie wartości konfiguracji.
więc nie będziesz mieć takich samych warunków powtarzania się w każdym miejscu i wypychania kodu. Oto przykładowy kod pokazujący, jak odzyskać wszystkie trasy, i możesz dopasować nazwę grupy tras, aby dalej przetwarzać w celu dopasowania do twojej sytuacji.
a tutaj jest przykładowy moduł obsługi oprogramowania pośredniego, w którym możesz sprawdzić, czy dana funkcja jest aktywna, dopasowując ją do tego, co już zapisałeś w bazie danych.
źródło
Zakładając, że te funkcje są potrzebne tylko w przypadku żądań HTTP.
Utworzyłbym domyślną
Features
klasę bazową ze wszystkimi domyślnymi flagami:Następnie rozszerzałbym tę klasę dla każdej domeny i ustawiłem przesłonięcia potrzebne dla tej domeny:
Następnie utwórz oprogramowanie pośrednie, aby powiązać klasę funkcji z kontenerem:
Nie zapomnij dołączyć tego oprogramowania pośredniego do swoich tras: do grupy lub dla każdej trasy.
Następnie możesz wpisać Wskazówka do swojej klasy Funkcje w kontrolerach:
źródło
Laravel świetnie sobie z tym radzi, możesz nawet przechowywać swoje funkcje w db i tworzyć relacje między domeną.
Polecam używać bramek i zasad, które zapewnią lepszą kontrolę nad kontrolerami i szablonami bloków. Oznacza to, że rejestrujesz bramy z bazy danych lub kodujesz je na stałe.
Na przykład, jeśli masz funkcję eksportu produktów z przyciskiem w systemie i chcesz udostępnić tę funkcję niektórym użytkownikom, możesz zarejestrować bramki za pomocą logiki biznesowej.
Następnie możesz wykonać następujące czynności w kontrolerach
Oto przykład szablonów ostrzy:
więcej informacji dostępnych na https://laravel.com/docs/5.8/authorization
źródło
Ciekawa sprawa, którą tu masz. Interesujące może być spojrzenie na
Feature
interfejs lub klasę abstrakcyjną, która zawiera kilka metod, których zwykle potrzebujesz.Możesz nawet podzielić je na
ExecutableFeature
iRenderableFeature
.Co więcej, można by stworzyć jakąś klasę fabryczną, aby ułatwić życie.
źródło
W moim przypadku utworzyłem nową tabelę w bazie danych, którą można nazwać
Domains
na przykład.Dodaj wszystkie specyficzne funkcje, które mogą być wyświetlane w niektórych domenach, ale nie w pozostałych, jako kolumny tej tabeli jako bit dla wartości boolowskich. Podobnie jak w moim przypadku
allow_multiple_bookings
,use_company_card
... cokolwiek.Następnie zastanów się nad utworzeniem klasy
Domain
i odpowiedniego repozytorium i po prostu zapytaj o te wartości w kodzie, próbując wcisnąć jak najwięcej logiki do swojej domeny (model, usługi aplikacji itp.).Na przykład nie sprawdziłbym metody kontrolera,
RequestBooking
czy domena, która żąda rezerwacji, może zażądać tylko jednego lub więcej.Zamiast tego robię to na urządzeniu,
RequestBookingValidatorService
które może sprawdzić, czy data rezerwacji minęła, użytkownik ma włączoną kartę kredytową, ... lub Domena, z której pochodzi ta akcja, może poprosić o więcej niż jedną rezerwację (a następnie, jeśli już ma każdy).Dodaje to wygodę czytelności, ponieważ przekazałeś tę decyzję swoim usługom aplikacyjnym. Ponadto stwierdzam, że ilekroć potrzebuję nowej funkcji, mogę użyć migracji Laravel (lub Symfony), aby dodać tę funkcję do tabeli, a nawet mogę zaktualizować jej wiersze (twoje domeny) o wartości, które chcę dla tego samego zatwierdzenia, które kodowałem.
źródło