2016-09-19 74 views
1

我有2个中间件。StaffMiddleware和AdminMiddleware Laravel 5.3

我StaffMiddleware

public function handle($request, Closure $next) 
{ 
    if($request->user()->role->name != 'staff'){ 

     return redirect()->route('store'); 
    } 
    return $next($request); 
} 

我AdminMiddleware

public function handle($request, Closure $next) 
{ 
    if($request->user()->role->name != 'admin'){ 

     return redirect()->route('store'); 
    } 
    return $next($request); 
} 

问题是我的UnitController

public function __construct(UnitInterface $unit){ 

     $this->middleware('staff'); 
     $this->middleware('admin); 
     $this->unit = $unit; 
    } 

它应该工作无论是角色是工作人员或管理员。我是否需要创建另一个中间件来将它们组合在一起?

回答

1

这完全取决于您的中间件的设计方式。正如你从代码中看到的那样,如果角色不是员工或不是管理员,它就会简单地重定向,所以你将无法获得或逻辑。

但是,您可以使用中间件参数来避免这种情况。

$this->middleware('role:admin,staff'); 

这将使用role中间件和通过adminstaff作为参数。

然后你就可以在你的中间件使用这些参数:

public function handle($request, Closure $next, ...$params) 
{ 
    if(!in_array($request->user()->role->name, $params)){ 

     return redirect()->route('store'); 
    } 
    return $next($request); 
} 

这抓住了额外的参数到一个数组$params在其中您可以检查用户的角色相匹配的参数之一。

+0

是的,我知道,我们可以实现 “admin或员工”?如果它具有管理员或员工的角色,那么没有其他问题重定向。 – Rbex

+0

@Rbex,我已经更新了我的答案,以显示如何使用参数使您的中间件更加灵活。这需要对中间件进行更改,但只需要一个中间件,而不是角色的各种组合。 – Devon

+0

这就是我正在寻找的......竖起大拇指! – Rbex

0
**try this** 

public function __construct(UnitInterface $unit){ 

     $this->middleware(function ($request, $next) { 
     if($request->user()->role->name == 'staff' || $request->user()->role->name == 'admin') 
      { 
      return $next($request); 
      } 
      return redirect()->route('store') 
     }); 
    } 

没有中间件