PHP MVC Как построить архитектуру для много-ролевого доступа

Пишу небольшой веб-ресурс для заведения нескольких справочников для большой системы. Есть 3 роли: админ, менеджер, пользователь.

Выбрал вариант, что каждая роль будет на отдельном контроллере со своими вьюшками, или иногда вьюшки можно заимствовать. Но контроллеры отдельные. Такой вариант нормальный?

П.С: выбрал такой вариант, так как если все роли реализовывать в одном контроллере, то код тогда путанным становится, так как у всех ролей свой уровень разрешенных операций, да и иногда вьюшка отличается по внешнему виду немного. Пришел к выводу за последнее время, что пытаясь избежать дублирования кода, получается еще хуже - тяжеловатый код.


Ответы (1 шт):

Автор решения: Borislav

Вы собираетесь под каждую роль создать отдельный контроллер, как вариант, этот выбор решает вашу проблему, но что будет, если ролей у вас станет 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;
}

Таким образом, у вас будут контроллеры в единственном экземпляре, а логика по работе с разными пользователями будет инкапсулирована в специализированные сервисы.

→ Ссылка