【问题标题】:Identify Route's Group in Middleware识别中间件中的路由组
【发布时间】:2018-04-04 22:56:28
【问题描述】:

我的最终目标是通过验证提供给用户的权限来限制对路由组的访问。

这些目标“路由组”有一个公共父组,并且可能有零个或多个子组,这样,如果允许/访问这些目标“路由组”然后,用户也可以访问其所有子路由组。

为了实现这一点,我相信我需要通过中间件中的任何唯一字符串/参数来区分这些目标路由组,这确实得到了here 的回答。

但是,我想进一步概括这一点,通过将中间件应用于所有这些目标路由组的公共 SINGLE PARENT GROUP,并通过中间件中的任何方式识别这些目标路由组。

那么,我的问题是如何在中间件中识别/区分这些目标路由组?有什么办法吗?

我试图描述的示例代码:

Route::group(['prefix' => 'singleParent','middleware' => 'permissionMiddleware'], function (){
    Route::group(['prefix' => 'target-group-1', 'groupUniqueString' => 'tsg1'], function (){
        Route::group(['prefix' => 'sub-group-1.1'], function (){

        });
        Route::group(['prefix' => 'sub-group-1.2'], function (){

        });
    });
    Route::group(['prefix' => 'target-group-2', 'groupUniqueString' => 'tsg2'], function (){
        Route::get('route-1','Controller@method-of-Route1');
    });
});

【问题讨论】:

  • 您不能根据您的需要制作其他中间件来限制/访问您的 target-group-1 的某些内容并将中间件添加到该 route::group 吗? singleParent 组及其子组将遵循通用中间件 permissionMiddleware 但对于子组,您制作新的中间件来处理?
  • 这不是必需的...我想管理 SINGLE-PARENT 组的下一个 routeGroups 的权限...对于 targe-group-1 的子组/路由,它们将是可访问,如果允许用户使用 target-group-1

标签: laravel laravel-5 laravel-5.1


【解决方案1】:

所以,要在你的中间件中指定一个路由组来处理一些动作,你可以这样做:

Route::group(['prefix' => 'singleParent','middleware' => 'permissionMiddleware'], function (){
   Route::group(['prefix' => 'target-group-1', 'as' => 'tsg1.'], function (){
       //...
   });
});

这将生成带有前缀的路由名称:tsg1

现在在您的中间件中,您可以这样做来获取路由组:

function getCurrentRouteGroup() {
   $routeName = Illuminate\Support\Facades\Route::current()->getName();
   return explode('.',$routeName)[0];
}

更新

并检查:

if ($request->route()->named('name')) {
    //
}

return $next($request);

或者用另一种方法你可以实现:

要获取路由组的前缀,您可以执行以下操作:

$uri = $request->path(); 
// this will give you the url path like -> if this is the url : 
// http://localhost:8000/foo/bar you will get foo/bar

然后:

$prefix = explode('/',$uri)[0];
// and you will get 'foo'

让我知道这是否适合你。

【讨论】:

  • 你的想法很好,但我必须在其他使用它的地方更新路由名称,这比遵循here 回答的中间件参数方法更加忙碌。我想以最小的变化接近。
  • @nik 我知道这会很麻烦,我不确定,但你可以尝试使用这个$request->route()->getPrefix() 直接获取路由组的前缀,我在使用时使用过这个L5,我不确定它现在是否支持。然后您可以根据需要比较前缀并在中间件中实施规则。
  • @nik 如果可行,请告诉我,或者我有其他想法,我会更新我的答案。
  • 是的,成功了!但是,您能否分享一下您的另一个想法?
  • 您使用路径和前缀的方法几乎相似。两者都有效...谢谢!
猜你喜欢
  • 2015-10-26
  • 2018-10-22
  • 2020-04-17
  • 2016-12-09
  • 2022-01-11
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
相关资源
最近更新 更多