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
中间件并传递 admin
和 staff
作为参数。
然后你可以在你的中间件中使用这些参数:
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')
});
}
没有中间件
我有 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
中间件并传递 admin
和 staff
作为参数。
然后你可以在你的中间件中使用这些参数:
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')
});
}
没有中间件