【问题标题】:Add Multiple Middleware to Laravel Project向 Laravel 项目添加多个中间件
【发布时间】:2019-08-02 00:26:34
【问题描述】:

我是 laravel 的新手,我已经为我的每个角色创建了中间件,但是当我将它添加到我的路由时它就不起作用了。

如果我将单个中间件添加到我的路由中,它可以正常工作,但是当我添加第二个和第三个时,它将无法正常工作。

它不会显示到授权user 的路线,而是将其重定向到家,

我的用户模型:

public function IsAdmin()
{
    if($this->role_id =='1')
    {
        return true;
    }
    else
    {
        return false;
    }
}

public function IsManager()
{
    if($this->role_id =='2')
    {
        return true;
    }
    else
    {
        return false;
    }
}

public function IsUser()
{
    if($this->role_id =='3')
    {
        return true;
    }
    else
    {
        return false;
    }
}

我的内核:

'IsAdmin' => \App\Http\Middleware\IsAdmin::class,
'IsManager' => \App\Http\Middleware\IsManager::class,
'IsUser' => \App\Http\Middleware\IsUser::class,

我的 IsAdmin 中间件:

public function handle($request, Closure $next)
{
    $user =Auth::User();
    if(!$user->IsAdmin())
    {
        return redirect('stock');
    }
    return $next($request);
}

我的 IsManager

public function handle($request, Closure $next)
{
    $user =Auth::User();
    if(!$user->IsManager())
    {
        return redirect('stock');
    }
    return $next($request);
}

和IsUser

public function handle($request, Closure $next)
{
    $user =Auth::User();
    if(!$user->IsUser())
    {
        return redirect('stock');
    }
    return $next($request);
}

最后是我的路线

Route::get('approv',['middleware'=>['IsManager','IsAdmin'],function(){
    return view('approv');
}]);

【问题讨论】:

  • 错误是什么?你只是说我不工作?你看到了什么,你期待什么?
  • 它不会向授权用户显示路由,而是将其重定向到股票页面

标签: php laravel eloquent laravel-middleware


【解决方案1】:

这不会像您期望的那样工作。 所有中间件需要通过才能处理请求,这意味着您的用户需要同时是经理和管理员,根据您的设置是不可能的。

您可以通过制作不同类型的中间件来解决这个问题:

内核:

'roles' => \App\Http\Middleware\Roles::class,

还有 Roles 中间件:

class Roles {

    private function checkRole($role) {
          switch ($role) {
              case 'user': return \Auth::user()->IsUser();
              case 'manager': return \Auth::user()->IsManager();
              case 'admin': return \Auth::user()->IsAdmin();
          }
          return false;
    }

    public function handle($request, Closure $next, ...$roles) 
    {
         foreach ($roles as $role) {
             if ($this->checkRole($role)) {
                 //At least one role passes
                 return $next($request);
             }
         } 
         //All checks failed so user does not have any of the required roles
         return redirect('stock');  
    }
}

然后,您只需这样做:

Route::get('approv',['middleware'=>['roles:manager,admin'],function(){
   return view('approv');
}]);

这是因为 Laravel 中间件支持参数。您可以将参数作为逗号分隔的字符串列表传递,您可以在其中声明中间件。在这种情况下,这是作为 roles:manager,admin

完成的

Laravel 会将这些参数作为附加参数发送到 handle 方法中。这些可以使用可变参数的 PHP 语法来访问。在这种特殊情况下,它是通过使用数组扩展运算符。这在 PHP 手册的 function arguments 部分中作为示例进行了记录。

请注意,这实际上相当于说:

  public function handle($request, Closure $next, $role1=null, $role2=null, $role3=null)

但使用扩展运算符要方便得多,因为...$roles 将是一个仅包含在中间件中传递的角色的数组。

【讨论】:

  • 感谢您的回答我复制了您的代码并将其粘贴到我的项目中,现在它给了我这个错误“为 foreach() 提供的参数无效”
  • 哇,你们真是天才,它起作用了,你能解释一下这意味着什么是“...$roles”三点。谢谢
  • 我已经用简短的解释更新了答案。简而言之,它只是表明 handle 将采用可变数量的参数,并且这些额外的参数将作为 $roles 中的数组访问。
猜你喜欢
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
相关资源
最近更新 更多