我正在尝试添加一个简单的中间件来检查用户是否匹配某个角色。当我使用中间件时遇到问题,我得到一个异常:
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);
}
}
在users表中,我有一个角色字段,在User模型中我有:
/**
* 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的原因有什么想法?
答案 0 :(得分:3)
在Http/Kernel.php
中,您需要包含RoleMiddleware
的完整路径。 E.g:
...
'role' => [
\App\Http\Middleware\RoleMiddleware::class,
],
...
答案 1 :(得分:3)
要使Spatie / Laravel-Permissions正常工作,我们必须在role
中注册两个路由中间件(permission
和app/Http/Kernel.php
),如下所示,以及其他两个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,
];
答案 2 :(得分:1)
这归结为两个问题:
$ middlewareGroups可能不允许参数。 (需要确认)将角色中间件删除到$ routeMiddleware摆脱异常。
在'role:admin'之后使用'web'会导致null $ request-> user()。因此,对于未来的用户,您可能需要考虑放置中间件并检查$ request-> user()是否为空。
希望这有助于其他人。
答案 3 :(得分:1)
尝试更改此
Route::group(['prefix' => 'support', 'middlewareGroups' => ['role:admin', 'web']], function() {
Route::get('threads', 'ThreadController@index');
});
到
public class Person {
private StringProperty firstName;
public void setFirstName(String value) { firstNameProperty().set(value); }
public String getFirstName() { return firstNameProperty().get(); }
public StringProperty firstNameProperty() {
if (firstName == null) firstName = new SimpleStringProperty(this, "firstName");
return firstName;
}
private StringProperty lastName;
public void setLastName(String value) { lastNameProperty().set(value); }
public String getLastName() { return lastNameProperty().get(); }
public StringProperty lastNameProperty() {
if (lastName == null) lastName = new SimpleStringProperty(this, "lastName");
return lastName;
}
}
我是laravel的初学者我遇到了同样的问题,并通过将名称从中间件更改为"你自己的middelware-name"来修复。