Laravel 如何根据用户角色过滤请求参数?
How to filter request parameters based on user role in Laravel?
我有一个具有管理员、经理和员工角色的应用程序。
经理可以编辑所有员工的字段 A、B、C。
管理员可以编辑所有用户的字段 A、B、D、E。
问题:如何根据用户角色过滤参数?
考虑因素:
- 我不想用
if/else
子句过滤控制器内部的参数,因为感觉太脏了。
- 有一个扩展
FormRequest
class 的选项,但这是一个 hacky 方法。代码最终不是很可读,因为 FormRequest
从来没有用于操纵请求。
- 我可以将这个逻辑分离到控制器内部的私有方法中。它有效,但仍然有一个胖控制器。
- 我可以将管理员、经理和用户的路由和控制器分开。代码看起来更简单,但结构更复杂。
大家对此有何看法?还有其他建议吗?
非常感谢!
编辑:-------------
只是澄清一下,因为很多人对我的问题感到困惑:
我已经在使用 Policy
和 Gate
进行授权。当您想更新用户时,我要问的是关于这种特定情况。经理可以更新某些字段(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
谢谢大家花时间回答我的问题!
我有一个具有管理员、经理和员工角色的应用程序。 经理可以编辑所有员工的字段 A、B、C。 管理员可以编辑所有用户的字段 A、B、D、E。
问题:如何根据用户角色过滤参数?
考虑因素:
- 我不想用
if/else
子句过滤控制器内部的参数,因为感觉太脏了。 - 有一个扩展
FormRequest
class 的选项,但这是一个 hacky 方法。代码最终不是很可读,因为FormRequest
从来没有用于操纵请求。 - 我可以将这个逻辑分离到控制器内部的私有方法中。它有效,但仍然有一个胖控制器。
- 我可以将管理员、经理和用户的路由和控制器分开。代码看起来更简单,但结构更复杂。
大家对此有何看法?还有其他建议吗?
非常感谢!
编辑:-------------
只是澄清一下,因为很多人对我的问题感到困惑:
我已经在使用 Policy
和 Gate
进行授权。当您想更新用户时,我要问的是关于这种特定情况。经理可以更新某些字段(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
谢谢大家花时间回答我的问题!