【问题标题】:Laravel RoleMiddleware, class role not foundLaravel RoleMiddleware,找不到类角色
【发布时间】:2016-05-16 18:33:56
【问题描述】:

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

ReflectionException:类角色不存在

我没有尝试调用名为 role 的类,所以我认为这在 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);
    }

}

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

/**
 * 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 的原因有任何想法吗?

【问题讨论】:

  • 尝试\App\Http\Middleware\RoleMiddleware::class 并同时执行dump-autoload,然后告诉我们它是否有效。
  • 命名空间很好,它可以到达类,如果我只使用中间件'role'而不是'role:admin',它会抛出一个关于缺少参数的错误。

标签: php laravel laravel-5 middleware


【解决方案1】:

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

/**
 * 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,
];

【讨论】:

  • 您现在也可以将'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class, 添加到protected $routeMiddleware
  • 发现in the docs
【解决方案2】:

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

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

【讨论】:

  • 它是使用导入的,因此不需要完整的命名空间。
【解决方案3】:

尝试改变这一点

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”来解决。

【讨论】:

    【解决方案4】:

    这归结为两个问题:

    1. $middlewareGroups 可能不允许使用参数。 (需要确认)将RoleMiddleware 降到$routeMiddleware 消除了异常。

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

    希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-09-19
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多