Я создаю приложение Laravel, которое имеет ряд различных функций. Я хочу иметь возможность включать или отключать их в зависимости от требований конкретного домена. В настоящее время в моей конфигурации есть ряд флагов, таких как:
'is_feature_1_enabled' => true,
'is_feature_2_enabled' => false,
... и так далее.
Затем в своих контроллерах и представлениях я проверяю эти значения конфигурации, чтобы увидеть, следует ли мне отображать что-либо, разрешать определенные действия и т. Д. Мое приложение начинает загрязняться такими проверками повсюду.
Есть ли лучший метод управления функциями в приложении Laravel?
laravel
laravel-5
design-patterns
laravel-4
StackOverflowNewbie
источник
источник
Ответы:
Технически это называется флагами функций - https://martinfowler.com/articles/feature-toggles.html.
зависит от ваших требований, флагов в config / database, rollout и т.д ...
Но это в основном, если в коде и не может быть чистым.
Пакеты Laravel:
https://github.com/alfred-nutile-inc/laravel-feature-flag
https://github.com/francescomalatesta/laravel-feature
Некоторые услуги:
https://launchdarkly.com/
https://bullet-train.io/
https://configcat.com/
Также посмотрите https://marketingplatform.google.com/about/optimize/ для веб-интерфейса.
источник
Я столкнулся с той же проблемой, когда пытался внедрить несколько поставщиков отелей.
Я использовал сервисный контейнер.
Сначала вы создадите класс для каждого домена со своими особенностями:
тогда вы будете использовать привязку в вашем сервис-провайдере приложений, чтобы связать домен с классом для использования.
Обратите внимание, что вы можете использовать общий класс, который содержит все функции, и использовать этот общий класс в ваших классах.
Наконец, в вашем контроллере вы можете проверить свой домен, чтобы использовать класс, который вы собираетесь использовать
источник
Похоже, вы жестко программируете вещи, основываясь на значениях конфигурации, чтобы включить или отключить определенные функции. Я рекомендую вам управлять вещами на основе именованных маршрутов, а не значений конфигурации.
поэтому у вас не будет одинаковых условий, повторяющих каждый раз и раздувающих ваш код. Вот пример кода, показывающий, как извлечь все маршруты, и вы можете сопоставить имя группы маршрутов для дальнейшей обработки в соответствии с вашей ситуацией.
и вот пример обработчика промежуточного программного обеспечения, где вы можете проверить, активна ли конкретная функция, сопоставив ее с тем, что вы уже сохранили в своей базе данных.
источник
Предполагая, что эти функции нужны только для HTTP-запросов.
Я бы создал
Features
базовый класс по умолчанию со всеми флагами по умолчанию:Затем я бы расширил этот класс для каждого домена и установил переопределения, необходимые для этого домена:
Затем создайте промежуточное программное обеспечение, чтобы связать класс пространственных объектов с контейнером:
Не забудьте прикрепить это промежуточное ПО к своим маршрутам: к группе или для каждого маршрута.
После этого вы можете напечатать свой класс Features в ваших контроллерах:
источник
Laravel отлично справляется с этим, вы даже можете хранить свои функции в БД и создавать отношения между доменом.
Я бы порекомендовал использовать Gates и Policies, которые дадут вам лучший контроль над вашими контроллерами и шаблонами блейдов. Это означает, что вы регистрируете ворота из своей базы данных или жестко их кодируете.
Например, если у вас есть функция экспорта товаров с помощью кнопки в вашей системе, и вы хотите сделать эту функцию доступной для некоторых пользователей, вы можете зарегистрировать ворота с помощью бизнес-логики.
Тогда вы можете сделать следующее в контроллерах
Вот пример для ваших шаблонов лезвий:
дополнительная информация доступна на https://laravel.com/docs/5.8/authorization
источник
Интересный случай у вас здесь. Может быть интересно взглянуть на
Feature
интерфейс или абстрактный класс, который содержит несколько методов, которые вам обычно нужны.Вы могли бы даже разделить их на
ExecutableFeature
иRenderableFeature
.Далее можно было бы создать какой-то заводской класс, чтобы облегчить жизнь.
источник
В моем случае я создал новую таблицу в базе данных, например, ее можно назвать
Domains
.Добавьте все конкретные функции, которые могут отображаться в некоторых доменах, но не в остальных, в качестве столбцов для этой таблицы в качестве бита для логических значений. Как в моем случае
allow_multiple_bookings
,use_company_card
... что угодно.Затем рассмотрите возможность создания класса
Domain
и его соответствующего репозитория и просто задайте эти значения в своем коде, стараясь как можно больше внедрить эту логику в ваш домен (модель, службы приложений и т. Д.).Например, я бы не стал проверять метод контроллера,
RequestBooking
если домен, запрашивающий бронирование, может запросить только один или несколько.Вместо этого я делаю это на элементе,
RequestBookingValidatorService
который может проверить, прошло ли время бронирования, у пользователя есть активированная кредитная карта, ... или домен, с которого происходит это действие, может запросить более одного бронирования (и затем, если он уже имеет Любые).Это добавляет удобство чтения, поскольку вы передали это решение своим службам приложений. Кроме того, я обнаружил, что всякий раз, когда мне нужна новая функция, я могу использовать миграции Laravel (или Symfony), чтобы добавить эту функцию в таблицу, и я даже могу обновить ее строки (ваши домены) значениями, которые я хочу для того же кода, который я кодировал.
источник