Как отфильтровать параметры запроса по роли пользователя в Laravel? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть приложение, в котором есть роли администратора, менеджера и сотрудника.Менеджер может редактировать поля A, B, C всех сотрудников.Администратор может редактировать поля A, B, D, E всех пользователей.

Вопрос: Как фильтровать параметры по роли пользователя?

Соображения:

  1. Я не хочу фильтровать параметры внутри контроллера с помощью предложения if/else, потому что оно кажется таким грязным.
  2. Существует возможность расширенияFormRequest класс, но это хакерский подход.Код оказывается не очень читабельным, поскольку FormRequest никогда не предназначен для манипулирования запросами.
  3. Я могу разделить эту логику на частный метод внутри контроллера.Это работает, но все еще есть толстый контроллер.
  4. Я могу разделить маршруты и контроллеры для администратора, менеджера и пользователя.Код выглядит намного проще за счет более сложной структуры.

Какое у вас мнение по этому поводу?Любые другие предложения?

Большое спасибо!

Редактировать: -------------
Просто разъяснение, поскольку многиезапутался в том, что я спрашиваю:

Я уже делаю авторизацию с Policy и Gate.Я спрашиваю об этом конкретном случае, когда вы хотите обновить пользователя.Менеджер может обновить некоторые определенные поля (A, B, C), в то время как администратор может обновить другие поля (A, B, D, E).
Теперь нам нужно принять различные параметры запроса в соответствии с ролью пользователя, но где следуетмы делаем это?В этом контроллере, в расширенном классе FormRequest или в отдельном контроллере?

Спасибо !!!

Ответы [ 3 ]

1 голос
/ 19 марта 2019

Может быть, выстрел в темноте, но не могли бы вы создать класс для каждой имеющейся у вас роли, в которой есть константа, определяющая, какие поля доступны для этой конкретной роли?

class AdminRole
{
    CONST EDITABLE_USER_FIELDS = [
        'name',
        'address',
        'phone',
        ...
    ];
}

и по вашему запросу:

$className = ucfirst($user->getRole()) . 'Role';

$fields = $className::EDITABLE_USER_FIELDS;

$data = $request->only($fields);

Я не проверял это, но это должно работать, если имена ваших классов совпадают с именами ролей.

Надеюсь, это поможет!

0 голосов
/ 20 марта 2019

Я нашел это видео на Laracasts, которые я смотрел давно, но забыл.Это дало мне точный ответ, который мне был нужен.
Видимо, создание нового контроллера и соблюдение соглашений CRUD Laravel - вот путь.https://laracasts.com/series/laravel-from-scratch-2018/episodes/20

Спасибо всем, что нашли время ответить на мой вопрос!

0 голосов
/ 19 марта 2019

Я думаю, что вы используете ту же таблицу, скажем, «пользователи» для хранения данных для администратора, менеджера и сотрудника. Создайте новый столбец с именем 'user_role'. Каждому пользователю будут предоставлены 1, 2 и 3 для администратора, менеджера и сотрудника соответственно. Вам просто нужно извлечь 'user_role' из таблицы.

Далее , вам нужно сделать универсальную функцию для роли и передать в нее user_role.

...