Laravel 如何根据用户角色过滤请求参数?

How to filter request parameters based on user role in Laravel?

我有一个具有管理员、经理和员工角色的应用程序。 经理可以编辑所有员工的字段 A、B、C。 管理员可以编辑所有用户的字段 A、B、D、E。

问题:如何根据用户角色过滤参数?

考虑因素:

  1. 我不想用if/else子句过滤控制器内部的参数,因为感觉太脏了。
  2. 有一个扩展 FormRequest class 的选项,但这是一个 hacky 方法。代码最终不是很可读,因为 FormRequest 从来没有用于操纵请求。
  3. 我可以将这个逻辑分离到控制器内部的私有方法中。它有效,但仍然有一个胖控制器。
  4. 我可以将管理员、经理和用户的路由和控制器分开。代码看起来更简单,但结构更复杂。

大家对此有何看法?还有其他建议吗?

非常感谢!

编辑:-------------
只是澄清一下,因为很多人对我的问题感到困惑:

我已经在使用 PolicyGate 进行授权。当您想更新用户时,我要问的是关于这种特定情况。经理可以更新某些字段(A、B、C),而管理员可以更新其他字段(A、B、D、E)。
现在我们需要根据用户角色接受不同的请求参数,但是应该在哪里做呢?在此控制器中,在扩展的 FormRequest class 中还是在单独的控制器中?

谢谢!!!

我认为您正在使用相同的 table 说 'users' 来存储管理员、经理和员工的数据。新建一个列说 'user_role'。每个用户将分别获得 admin、manager 和 employee 1、2 和 3。您只需要从 table.

中获取 'user_role'

下一步,你需要为角色创建通用函数并将user_role传递给它。

也许是盲目尝试,但您能否为您拥有的每个角色创建一个 class,它有一个常量来决定该特定角色可以使用哪些字段?

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

并在您的请求中:

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

$fields = $className::EDITABLE_USER_FIELDS;

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

我没有对此进行测试,但只要您的 class 名称与角色名称相同,这应该会起作用。

希望对您有所帮助!

我在 Laracasts 上找到了这个很久以前看过但忘了的视频。它给了我所需的确切答案。
显然创建一个新的控制器并坚持 Laravel 的 CRUD 约定是可行的方法。 https://laracasts.com/series/laravel-from-scratch-2018/episodes/20

谢谢大家花时间回答我的问题!