Например, у нас есть две функции: группы доступа, целевые группы, и в будущем могут быть добавлены другие. Также у нас есть сущность Company, к которой относится сущность User 1: M (Company to User).
Таким образом, в разных местах кодовой базы нам нужно проверить, включены ли некоторые из этих функций для Company (а также для User) : в классах запросов, классы запросов (т. е. репозитории, запросы или даже модели зависят от вашего выбора), действия / команды / службы и т. д. c.
Ясно, что повсеместная повторная проверка, как показано ниже, не принимается по DRY.
if ($user->company->access_groups_feature_enabled) {
...
} else {
...
}
Должно быть одно место с проверкой, включена или отключена та или иная функция, там же мы должны выбрать правильные Запросы / Услуги / Репозитории / et c, поэтому, если функция «Группы доступа включена», мы должны загрузить RequestImplyingAccessGroups , SomeEntityLikeUserRepositoryImplyingAccessGroup , ShowNewsServiceImplyingAccessGroups и т. д. (не беспокойтесь о присвоении имен, это просто для примера понимаю, что я имею в виду).
То же самое относится к целевым группам и другим функциям. Затем мы должны использовать эти классы с помощью общих зависимостей интерфейса, вводя их как-то в классы агностии c.
Я думаю, что это может быть сделано на уровне Middleware, но сейчас я немного запутался.
Есть ли лучшая практика для такого случая? Как вы реализовали это в своих проектах?
Также я нашел статью Фаулера об этом: https://martinfowler.com/articles/feature-toggles.html Но я думаю, что я немного запутался, применяя ее для laravel инфраструктуры.