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

问题描述 投票:0回答:3

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

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

注意事项:

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

你们对此有什么看法?还有其他建议吗?

非常感谢!

编辑: - - - - - - - 只是一个澄清,因为许多人对我的要求感到困惑:

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

谢谢!!!

laravel parameters request authorization roles
3个回答
1
投票

黑暗中的一个镜头可能,但你可以为你拥有的每个角色创建一个类,它有一个常量来决定哪个字段可用于该特定角色?

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

并在您的请求中:

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

$fields = $className::EDITABLE_USER_FIELDS;

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

我没有对此进行测试,但只要您的类名与角色名称相同,这就应该有效。

希望这可以帮助!


0
投票

我认为您使用相同的表称“用户”用于存储管理员,经理和员工的数据。创建一个新列说'user_role'。每个用户将分别为管理员,经理和员工提供1,2和3。您只需从表中获取“user_role”即可。

接下来,您需要为角色创建泛型函数并将user_role传递给它。


0
投票

我在Laracasts上发现了这个视频,我很久以前就看过但是忘记了。它给了我我需要的确切答案。 显然创建一个新的控制器并坚持Laravel的CRUD约定是要走的路。 https://laracasts.com/series/laravel-from-scratch-2018/episodes/20

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

© www.soinside.com 2019 - 2024. All rights reserved.