角色中间件动态参数 拉拉维尔 5.4.



我有一个角色中间件,它将参数传递给中间件。

 public function __construct(UserInterface $user, RoleInterface $role, MaritalStatusInterface $maritalStatus, CityInterface $city){
        $this->middleware('auth');
        //$this->middleware('role:System Admin'); I changed it to 6 for the id.
        $this->middleware('role:6');
    }

我的角色中间件是这个

 public function handle($request, Closure $next, ...$params)
    {

        $roles = $request->user()->roles()->get();
        $roles = $roles->map(function($item){
            return $item->id;
        });
        foreach ($params as $value) {
            if( ! in_array($value, $roles->toArray())){
                return redirect()->action('NavController@home');
            }
        }

        return $next($request);
    }

如您所见,我与6息息相关。如果我想添加7怎么办...我想动态地制作它。我的桌子Users Role_User Roles.我需要什么表以及如何执行它。

由于您想要动态它,因此您应该为允许的角色提供一个数据库..那么在同一个控制器中您应该这样做

$allowedRoles = AllowedRoles::all();
$loop=1;
foreach($allowedRoles as $role)
{
    $roleString = $loop == 1 ? $role->value : $roleString.'|'.$role->value;
    // where value is equivalent to the role of your role id in role database
    $loop++;
}
$this->middleware('role:'.$roleString);

那么在你的中间件中,你应该分解角色字符串

public function handle($request, Closure $next, $roles)
{
    $roles = explode('|',$roles);
    $user = User::find($request->user()->id);
    foreach($user->intRoles as $myRole)
    {
        if(in_array($myRole->role_id, $roles))
        {
            return $next($request);
        }
    }
    // Redirect
    return redirect()->back();
}

最新更新