2016-05-16 2 views
1

Я пытаюсь добавить простое промежуточное программное обеспечение, чтобы проверить, соответствует ли пользователь роли. Я бегу на вопрос, когда я использую промежуточное, я получаю исключение:Laravel RoleMiddleware, роль класса не найден

ReflectionException: классовая роль не существует

Я не пытаюсь вызвать роль класса, названный так я полагаю, это происходит волшебным образом в Ларавеле.

Мой промежуточного слоя:

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

} 

В таблице пользователей, у меня есть поле роль и в модели пользователя у меня есть:

/** 
* 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

Try '\ App \ Http \ Middleware \ RoleMiddleware: : class' и execute 'dump-autoload' также, а затем сообщите нам, если он работает. –

+0

Пространство имен прекрасно, оно может дойти до класса, и оно вызывает ошибку в отношении отсутствующего аргумента, если я просто использую роль middleware вместо роли: admin. – Devon

ответ

3

В Http/Kernel.php вам необходимо указать полный путь до RoleMiddleware. Например .:

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

Импортируется с использованием, поэтому полное пространство имен не требуется. – Devon

0

Это свелось к двум проблемам:

  1. $ middlewareGroups может не позволить параметров. (Требуется подтверждение). Отбрасывание RoleMiddleware до $ routeMiddleware избавилось от исключения.

  2. Наличие 'web' после 'role: admin' привело к нулевому запросу $ 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, 
];