我有多个中间件(学生,家长,管理员),并使用该中间件创建一些路由组。但是某些路由可以访问用户是否在任何组中,是否属于任何中间件,但不能访问其他中间件,例如teacher。我在文档中使用类似的东西:http://laravel.com/docs/5.1/routing#route-groups但它的工作,当我把一个路由,当添加另一个路由组与另一个中间件它不工作。这可能吗?如何实现?
当我执行php artisan route时,它会给我一个错误
[Symfony'Component'Debug'Exception'FatalErrorException]
Call to a member function inRole() on null
Laravel的路由中间件按照routes.php文件中的声明逐一执行。因此,如果其中一个通过抛出异常或返回一些响应来拒绝访问,则下一个中间件将不会被执行。
为了使其工作,您将需要一个中间件来检查当前用户是否具有所需的任何角色。幸运的是,从Laravel 5.1开始,你可以通过routes.php文件(参见http://laravel.com/docs/5.1/middleware#middleware-parameters)将参数传递给中间件,所以你只需要一个中间件类来处理所有的情况。
中间件类的示例如下:
class HasAnyRole
{
public function handle($request, Closure $next, $roles)
{
// Return Not Authorized error, if user has not logged in
if (!$request->user) {
App::abort(401);
}
$roles = explode(',', $roles);
foreach ($roles as $role) {
// if user has given role, continue processing the request
if ($request->user->hasRole($role)) {
return $next($request);
}
}
// user didn't have any of required roles, return Forbidden error
App::abort(403);
}
}
在Kernel.php:
中注册中间件protected $routeMiddleware = [
'has_any_role' => 'App'Http'Middleware'HasAnyRole',
];
现在,在你的routes.php中,你可以像这样将中间件应用到一个组:
//this route is available only to users with role admin or author
Route::put('post/{id}', ['middleware' => 'has_any_role:admin,author', function ($id) {
//
}]);
这应该可以达到目的,只要确保您的User类有一个hasRole方法。