2016-05-16 35 views
1

我正在嘗試添加一個簡單的中間件來檢查用戶是否與角色匹配。我快到時,我使用中間件的一個問題,我得到一個異常:Laravel RoleMiddleware,找不到類角色

ReflectionException:類角色不存在

我不試圖調用類命名角色,所以我承擔這在神奇的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表中,我有一個角色字段,並在用戶模式,我有:

/** 
* 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', '[email protected]'); 
}); 

在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

嘗試'\軟件\ HTTP \中間件\ RoleMiddleware: :class'並執行'dump-autoload',然後告訴我們它是否工作。 –

+0

命名空間很好,它可以到達該類,並且如果我只是使用中間件'角色'而不是'role:admin',它會拋出有關缺少參數的錯誤。 – Devon

回答

3

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

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

它被導入使用,所以不需要完整的名稱空間。 – Devon

0

這歸結爲兩個問題:

  1. $ middlewareGroups可能不允許參數。 (需要確認)將RoleMiddleware放置到$ routeMiddleware中去除異常。

  2. 在'role:admin'之後'web'導致null $ request-> user()。因此對於未來的用戶,您可能需要考慮放置您的中間件,並檢查$ request-> user()是否爲空。

希望這可以幫助別人。

0

試圖改變這種

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

Route::group(['prefix' => 'support', 'middlewareGroups' => ['role:admin', 'web']], function() { 
    Route::get('threads', '[email protected]'); 
}); 

我在laravel我面臨同樣的問題,並通過中間件更改名稱固定初學者「你-own- middelware名」。

0

對於Spatie/Laravel-權限才能正常工作,我們在app/Http/Kernel.php註冊兩個途徑中間件如下,兩個身份驗證的中間件一起:

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