Это не будет работать так, как вы ожидаете. Все промежуточное ПО должно быть передано для обработки запроса, что означает, что ваш пользователь должен быть одновременно и администратором, и администратором, что на основе ваших настроек невозможно.
Вы можете обойти это (своего рода), сделав другой вид промежуточного программного обеспечения:
Ядро:
'roles' => \App\Http\Middleware\Roles::class,
И промежуточное ПО ролей:
class Roles {
private function checkRole($role) {
switch ($role) {
case 'user': return \Auth::user()->IsUser();
case 'manager': return \Auth::user()->IsManager();
case 'admin': return \Auth::user()->IsAdmin();
}
return false;
}
public function handle($request, Closure $next, ...$roles)
{
foreach ($roles as $role) {
if ($this->checkRole($role)) {
//At least one role passes
return $next($request);
}
}
//All checks failed so user does not have any of the required roles
return redirect('stock');
}
}
Затем, чтобы использовать это, вы просто делаете:
Route::get('approv',['middleware'=>['roles:manager,admin'],function(){
return view('approv');
}]);
Это работает, потому что параметры поддержки промежуточного программного обеспечения Laravel. Вы можете передавать параметры в виде списка строк через запятую, в котором вы объявляете промежуточное ПО. В этом случае это было сделано как roles:
manager,admin
Laravel отправит эти параметры в качестве дополнительных параметров в методе handle
. К ним можно получить доступ, используя синтаксис PHP для переменных аргументов. В данном конкретном случае это с помощью оператора распространения массива. Это задокументировано в качестве примера в разделе аргументы функции руководства по PHP.
Обратите внимание, что это на самом деле эквивалентно высказыванию:
public function handle($request, Closure $next, $role1=null, $role2=null, $role3=null)
, но использовать оператор распространения гораздо удобнее, поскольку ...$roles
будет массивом, который содержит только те роли, которые были переданы в промежуточном программном обеспечении.