PHP MVC Как построить архитектуру для много-ролевого доступа
Пишу небольшой веб-ресурс для заведения нескольких справочников для большой системы. Есть 3 роли: админ, менеджер, пользователь.
Выбрал вариант, что каждая роль будет на отдельном контроллере со своими вьюшками, или иногда вьюшки можно заимствовать. Но контроллеры отдельные. Такой вариант нормальный?
П.С: выбрал такой вариант, так как если все роли реализовывать в одном контроллере, то код тогда путанным становится, так как у всех ролей свой уровень разрешенных операций, да и иногда вьюшка отличается по внешнему виду немного. Пришел к выводу за последнее время, что пытаясь избежать дублирования кода, получается еще хуже - тяжеловатый код.
Ответы (1 шт):
Вы собираетесь под каждую роль создать отдельный контроллер, как вариант, этот выбор решает вашу проблему, но что будет, если ролей у вас станет 100?
С архитектурной точки зрения, такой код будет сложно поддерживать за счет дублирования: отладка/расширение/модификация вашего кода уже будет подразумевать посещение минимум 3-ех мест, которые вы должны держать в голове.
По хорошему, вы должны иметь один контроллер, так же иметь возможность проверить в нем роль и скорректировать относительно этого ваше поведение.
Как вариант: получаете пользователя, который имеет роль, далее, можно организовать фабрику или фабричный метод, для получения соответствующего сервиса и сделать что-то.
public function methodOfAnyClass(User $user, UserServicefactory $factory): Response
{
$role = $user->getRole();
/**
* Instance of UserService, ManagerService or AdminService which
* implements UserServiceInterface.
*
* @var UserServiceInterface $service
*/
$service = $factory->getServiceByUserRole($role);
$service->doSomething();
/**
* @var Response $response
*/
$response = $service->getSomething();
return $response;
}
Таким образом, у вас будут контроллеры в единственном экземпляре, а логика по работе с разными пользователями будет инкапсулирована в специализированные сервисы.