在中间件中获取 Laravel 动态路由参数
Get Laravel Dynamic Route parameter in middleware
我们使用 Laravel 5.6 构建了一个 CMS。我们制作了如下各种动态路线:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth');
通过这条路线,我们可以访问无限数量的已注册分类法,例如:
http://example.com/taxonomy/category
http://example.com/taxonomy/tag
...
因此,分类参数在我们的路由中是一个可变的东西。
现在我们做了一个中间件来允许用户根据他们授予的权限。使用我们的中间件,之前的路线将是:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{taxonomy?}');
这就是问题所在。我们无法将那个可变参数获取到中间件参数中。我们需要这个,因为用户可以拥有 category
的权限,但不能拥有 tag
的权限。但是通过这条路线,用户无法访问任何一个分类法。整个路线都被封锁了。
哦,我们也试过用双引号:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', "permissions:manage_{taxonomy?}");
有什么方法可以将动态路由变量传递给中间件吗?
修改 后,我们为我们的案例找到了解决方案:
我们正在传递如下路由权限:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{parameter}');
并像下面这样处理中间件中的权限:
<?php
public function handle($request, Closure $next, $caps) {
$current_args = $request->route()->parameters();
// array_shift() is enough as we are passing a single parameter only.
$current_parameter = array_shift($current_args);
if (strpos($caps, '{parameter}') !== false) {
// here the $caps become 'manage_{taxonomy}'
$caps = str_replace( '{parameter}', $current_parameter, $caps );
}
// hasUserCap() - custom method to check user capability.
if( hasUserCap( $caps, $request->user()->id ) ) {
return $next($request);
}
}
我们使用 Laravel 5.6 构建了一个 CMS。我们制作了如下各种动态路线:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth');
通过这条路线,我们可以访问无限数量的已注册分类法,例如:
http://example.com/taxonomy/category
http://example.com/taxonomy/tag
...
因此,分类参数在我们的路由中是一个可变的东西。
现在我们做了一个中间件来允许用户根据他们授予的权限。使用我们的中间件,之前的路线将是:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{taxonomy?}');
这就是问题所在。我们无法将那个可变参数获取到中间件参数中。我们需要这个,因为用户可以拥有 category
的权限,但不能拥有 tag
的权限。但是通过这条路线,用户无法访问任何一个分类法。整个路线都被封锁了。
哦,我们也试过用双引号:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', "permissions:manage_{taxonomy?}");
有什么方法可以将动态路由变量传递给中间件吗?
修改
我们正在传递如下路由权限:
route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{parameter}');
并像下面这样处理中间件中的权限:
<?php
public function handle($request, Closure $next, $caps) {
$current_args = $request->route()->parameters();
// array_shift() is enough as we are passing a single parameter only.
$current_parameter = array_shift($current_args);
if (strpos($caps, '{parameter}') !== false) {
// here the $caps become 'manage_{taxonomy}'
$caps = str_replace( '{parameter}', $current_parameter, $caps );
}
// hasUserCap() - custom method to check user capability.
if( hasUserCap( $caps, $request->user()->id ) ) {
return $next($request);
}
}