Laravel RoleMiddleware,未找到类角色

时间:2016-05-16 18:33:56

标签: php laravel laravel-5 middleware

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

  

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的原因有什么想法?

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

要使Spatie / Laravel-Permissions正常工作,我们必须在role中注册两个路由中间件(permissionapp/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)

这归结为两个问题:

  1. $ middlewareGroups可能不允许参数。 (需要确认)将角色中间件删除到$ routeMiddleware摆脱异常。

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

  3. 希望这有助于其他人。

答案 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"来修复。