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,
],
...
这归结为两个问题:
$middlewareGroups
可能不允许参数。 (需要确认)将 RoleMiddleware
降低到 $routeMiddleware
摆脱了异常。
在 '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
中注册两个路由中间件(role
和 permission
),以及另外两个 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,
];
我正在尝试添加一个简单的中间件来检查用户是否匹配某个角色。当我使用中间件时,我 运行 遇到了一个问题,我得到一个异常:
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,
],
...
这归结为两个问题:
$middlewareGroups
可能不允许参数。 (需要确认)将RoleMiddleware
降低到$routeMiddleware
摆脱了异常。在 '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
中注册两个路由中间件(role
和 permission
),以及另外两个 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,
];