我有一个具有管理员,经理和员工角色的应用程序。经理可以编辑所有员工的字段A,B,C。管理员可以编辑所有用户的字段A,B,D,E。
问题:如何根据用户角色过滤参数?
注意事项:
if/else
子句过滤控制器内的参数,因为它感觉很脏。FormRequest
类,但这是一个hacky方法。代码最终不太可读,因为FormRequest
从不打算用于操纵请求。你们对此有什么看法?还有其他建议吗?
非常感谢!
编辑: - - - - - - - 只是一个澄清,因为许多人对我的要求感到困惑:
我已经在与Policy
和Gate
进行授权。当您想要更新用户时,我要问的是这个特定情况。管理员可以更新某些字段(A,B,C),而管理员可以更新其他字段(A,B,D,E)。
现在我们需要根据用户角色接受不同的请求参数,但是我们应该在哪里执行此操作?在此控制器中,在扩展的FormRequest类中还是在单独的控制器中?
谢谢!!!
黑暗中的一个镜头可能,但你可以为你拥有的每个角色创建一个类,它有一个常量来决定哪个字段可用于该特定角色?
class AdminRole
{
CONST EDITABLE_USER_FIELDS = [
'name',
'address',
'phone',
...
];
}
并在您的请求中:
$className = ucfirst($user->getRole()) . 'Role';
$fields = $className::EDITABLE_USER_FIELDS;
$data = $request->only($fields);
我没有对此进行测试,但只要您的类名与角色名称相同,这就应该有效。
希望这可以帮助!
我认为您使用相同的表称“用户”用于存储管理员,经理和员工的数据。创建一个新列说'user_role'。每个用户将分别为管理员,经理和员工提供1,2和3。您只需从表中获取“user_role”即可。
接下来,您需要为角色创建泛型函数并将user_role传递给它。
我在Laracasts上发现了这个视频,我很久以前就看过但是忘记了。它给了我我需要的确切答案。 显然创建一个新的控制器并坚持Laravel的CRUD约定是要走的路。 https://laracasts.com/series/laravel-from-scratch-2018/episodes/20
谢谢大家花时间回答我的问题!