多个中间件无法在Laravel上运行

时间:2019-04-30 14:02:53

标签: php laravel middleware

我有一个路由资源组,只能由2个中间件规则之一访问。我已经注册了它们,并且如果我单独测试它们,它们都可以独立工作,但是当我将它们放在一起时,它们将无法工作

我尝试将它们都作为“或”语句运行(这意味着中间件按预期运行),但这意味着未登录的任何人也可以出于某种原因访问路由。如果我使用逗号分隔中间件,那么它将被所有人屏蔽。我知道两种中间件都可以正常工作,因为如果我单独尝试它们,它们就可以正常工作。我正在使用以下代码

Route::group(['middleware' => ['IsAdmin' or 'IsPatreon']], function(){
Route::resource('patreon', 'patreonGalleryController', ['names'=>[

  'index'=>'patreonGallery.index',
  'create'=>'patreonGallery.create',
  'store'=>'patreonGallery.store',
  'edit'=>'patreonGallery.edit',
  'show'=>'patreonGallery.show',
  'destroy'=>'patreonGallery.destroy',
  ]]);
});

如何设置它,以便只有管理员或patreon使用者才能看到路径?

2 个答案:

答案 0 :(得分:0)

两个中间件分别工作。 IsAdmin正在检查用户是admin IsPatreon正在检查用户是否是patreon ...

OR操作员不能合并这两种中间件

可能您需要创建新的中间件软件,例如 IsAdminOrPatreon,您是否会检查该中间件的内部并将该中间件添加到您的组中。

或者您可以尝试使用中间件参数,例如

Route::group(['middleware' => ['checkRoles:admin,patreon']], function(){
  Route::resource('patreon', 'patreonGalleryController', ['names'=>[

    'index'=>'patreonGallery.index',
    'create'=>'patreonGallery.create',
    'store'=>'patreonGallery.store',
    'edit'=>'patreonGallery.edit',
    'show'=>'patreonGallery.show',
    'destroy'=>'patreonGallery.destroy',
  ]]);
});

在您checkRoles中间件中,您将获得adminpatreaon这样的角色:

public function handle($request, Closure $next) {

    // will contain ['role1', 'role2']
    $allowedRoles = array_slice(func_get_args(), 2);

    // here you can loop and check your roles
}

注意!如果您通过'checkRoles:admin,patreon',您将获得

array(admin,patreon)

如果您通过'checkRoles:admin',您将得到

array(admin)

答案 1 :(得分:0)

您不能在中间件数组中使用or条件。中间件数组始终返回and条件。您可以在中间件中指定用户角色。