Laravel RoleMiddleware,class 找不到角色

Laravel RoleMiddleware, class role not found

我正在尝试添加一个简单的中间件来检查用户是否匹配某个角色。当我使用中间件时,我 运行 遇到了一个问题,我得到一个异常:

ReflectionException: class role does not exist

我没有尝试调用 class 命名角色,所以我假设这在 Laravel 某处神奇地发生了。

我的中间件:

class RoleMiddleware
{
    /**
     * Run the request filter.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string  $role
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (! $request->user()->is($role)) {
            return redirect('/login');
        }

        return $next($request);
    }

}

在用户 table 中,我有一个角色字段,在用户模型中我有:

/**
 * Check if a user is a certain role
 *
 * @param $role
 * @return bool
 */
function is($role) {
    return ($this->role == $role);
}

路由组:

Route::group(['prefix' => 'support', 'middleware' => ['role:admin', 'web']], function() {
        Route::get('threads', 'ThreadController@index');
});

在Http/Kernel.php:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'role' => [
        RoleMiddleware::class,
    ],
];

任何人对可能导致此 ReflectionException 的原因有任何想法吗?

Http/Kernel.php 中,您需要包含 RoleMiddleware 的完整路径。例如:

...
'role' => [
    \App\Http\Middleware\RoleMiddleware::class,
],
...

这归结为两个问题:

  1. $middlewareGroups 可能不允许参数。 (需要确认)将 RoleMiddleware 降低到 $routeMiddleware 摆脱了异常。

  2. 在 'role:admin' 之后有 'web' 结果是 null $request->user()。因此,对于未来的用户,您可能需要考虑放置中间件并检查 $request->user() 是否为空。

希望这对其他人有帮助。

尝试改变这个

Route::group(['prefix' => 'support', 'middleware' => ['role:admin', 'web']], function() {
    Route::get('threads', 'ThreadController@index');
});

Route::group(['prefix' => 'support', 'middlewareGroups' => ['role:admin', 'web']], function() {
    Route::get('threads', 'ThreadController@index');
});

我是 laravel 的初学者,我遇到了同样的问题并通过将名称从中间件更改为 "your-own-middelware-name" 来解决。

为了 Spatie/Laravel-Permissions 正常工作,我们必须如下在 app/Http/Kernel.php 中注册两个路由中间件(rolepermission),以及另外两个 auth中间件:

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
];