Php Laravel RoleMiddle软件,未找到类角色

Php Laravel RoleMiddle软件,未找到类角色,php,laravel,laravel-5,middleware,Php,Laravel,Laravel 5,Middleware,我试图添加一个简单的中间件来检查用户是否匹配角色。当我使用中间件时遇到问题,我得到一个异常: ReflectionException:类角色不存在 我不尝试调用名为role的类,所以我假设这是在Laravel某处神奇地发生的 我的中间件: class RoleMiddleware { /** * Run the request filter. * * @param \Illuminate\Http\Request $request * @par

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

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);
    }

}
/**
 * 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,
];
在用户表中,我有一个角色字段,在用户模型中我有:

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

有人知道是什么导致了这种反射异常吗?

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

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

这归结为两个问题:

  • $middlewareGroups
    可能不允许使用参数。(需要确认)将
    RoleMiddleware
    下拉到
    $routeMiddleware
    已清除异常

  • 在“role:admin”之后加上“web”会导致
    null
    $request->user()
    。因此,对于未来的用户,您可能需要考虑您的中间件的放置和检查,以查看<代码> $Quest-USER()/<代码>是否为空。 希望这对其他人有帮助。

    尝试改变这一点

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


    我是laravel的初学者,我也遇到了同样的问题,通过将名称从中间件更改为“您自己的中间件名称”来解决此问题。

    要使Spatiale/laravel权限正常工作,我们必须在
    app/Http/Kernel.php
    中注册双路由中间件(
    角色
    权限
    ),如下所示:,以及其他两个身份验证中间件:

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

    尝试
    \App\Http\Middleware\RoleMiddleware::class
    并执行
    dump autoload
    ,然后告诉我们它是否有效。命名空间很好,如果我只是使用中间件“role”而不是“role:admin”,它可以到达类,并且它会抛出一个关于缺少参数的错误。它是随use一起导入的,因此不需要完整的命名空间。您现在还可以添加
    “role\u或\u permission”=>\Spatie\permission\middleware\RoleOrPermissionMiddleware::class,
    受保护的$RouteMiddle软件
    找到它。