2016-09-19 12 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

これは、ミドルウェアの設計方法に完全に依存します。あなたのコードからわかるように、役割が職員でないか管理者でない場合は簡単にリダイレクトされるため、ORロジックを持つ方法はありません。

ただし、これを回避するためにミドルウェアパラメータを使用できます。

$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またはstaffの役割を持っている場合、他の問題はリダイレクトされません。 – Rbex

+0

@Rbex、私はあなたのミドルウェアをより柔軟にするためのパラメータの使い方を示すために答えを更新しました。ミドルウェアを変更する必要がありますが、ロールにはさまざまな組み合わせの代わりにミドルウェアが1つ必要です。 – 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') 
     }); 
    } 

んミドルウェア