Laravel Middleware,一个或另一个?

时间:2016-05-22 16:00:20

标签: php laravel

我有一个控制器,我在控制器中使用了3个中间件。

public function __construct(){
    $this->middleware('auth');
    $this->middleware('isAgency');
    $this->middleware('isAdmin');
}

问题是Laravel立即应用所有这些....如果我以管理员身份登录我无法打开索引,如果我再次以代理登录,则无法打开索引。 我想要的是用户可以是管理员或代理商来访问该控制器内的所有功能。

那么有什么方法可以应用一个或另一个中间件吗? 喜欢if(isAdmin || isAgency)

3 个答案:

答案 0 :(得分:2)

可以选择这样做 选项1:最简单的方法是创建一个包含其中三个的新中间件。例如

public function handle($request, Closure $next)
{
   // either one of this meet
   if (Auth::user()->isAgency() || Auth::user()->isAdmin) {
       return $next($request);
   } 

   // return the response
}


选项2:是使用仅适用于laravel 5的中间件参数。* laravel middleware parameters

答案 1 :(得分:0)

简单的说就是你可以为三个中间件声明三个不同的控制器

这可以用于auth控制器

public function __construct(){
  $this->middleware('auth');
}

这可以用于isAdmin控制器

public function __construct(){
  $this->middleware('isAdmin');
}

这可以用于isAgency控制器

public function __construct(){
  $this->middleware('isAgency');
}

答案 2 :(得分:0)

我使用此解决方案在一个控制器中使用2个中间件解决了我的问题:

在我之前的中间件文件中:

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

    if (Auth::user()->isAgency()) {
        return $next($request);
    } 

    abort(403);
}

现在我添加了isAdmin()中间件,以便管理员可以访问所有内容:

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

    if (Auth::user()->isAgency() || Auth::user()->isAdmin()) {
        return $next($request);
    } 

    abort(403);
}

和内部控制器我只使用中间件isAgency和管理员也包括

public function __construct(){
    $this->middleware('auth');
    $this->middleware('isAgency');
}