将数组传递给laravel中的中间件

Jor*_*rre 2 php authentication middleware laravel

我在一个名为rolMiddleware的中间件中得到了这个句柄:

public function handle($request, Closure $next, $roles)
{
    //dd($request->user());
    foreach ($roles as $rol) {
        if ($request->user()->getTipoUsuario($request->user()->tipo_usuario_id)->getNombreTipoUsuario() == $rol) {
            return $next($request);
        }
    }
    abort(403, "¡No hay autorizacion!");
}
Run Code Online (Sandbox Code Playgroud)

但$ roles是一个数组,这是我使用中间件的路线:

Route::get('/mid', ['middleware' => 'roles:super admin', function () {
    return "done";
}]);
Run Code Online (Sandbox Code Playgroud)

而给我的错误是:

ErrorException in RolMiddleware.php line 22:
Invalid argument supplied for foreach()
Run Code Online (Sandbox Code Playgroud)

你可能不需要数组,因为我只在超级管理员中使用它,因为我只需要超级管理员,但是会有超级管理员和区域管理员的路由.

has*_*san 10

在laravel中,您可以使用逗号分隔要传递给中间件的参数,,如下所示:

Route::get('/mid', ['middleware' => 'roles:super,admin', function () {
//                                              ^ note this
    return "done";
}]);
Run Code Online (Sandbox Code Playgroud)

请注意,这不会将参数作为数组发送,因此$roles除非使用传递的参数作为省略号参数,否则不能循环,如下所示:

public function handle($request, Closure $next, ...$roles)
Run Code Online (Sandbox Code Playgroud)

相反,您需要为每个角色使用单个参数:

public function handle($request, Closure $next, $role1, $role2) // .... and so on
Run Code Online (Sandbox Code Playgroud)

  • 省略号参数就是我所需要的。$roles 变成数组。非常感谢。 (4认同)