StaffMiddleware 和 AdminMiddleware Laravel 5.3

StaffMiddleware And AdminMiddleware Laravel 5.3

我有 2 个中间件。

我的 StaffMiddleware

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

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

我的管理中间件

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;
    }

无论角色是员工还是管理员,它都应该有效。我是否需要创建另一个中间件来将它们结合起来?

这完全取决于你的中间件的设计方式。正如您从代码中看到的那样,如果角色不是员工或管理员,它会简单地重定向,因此您无法使用 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,您可以在其中检查用户的角色是否与其中一个参数匹配。

**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')
        });
    }

没有中间件