我们使用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?}");
我们有什么办法可以将动态路由变量传递给中间件吗?
答案 0 :(得分:0)
在修改the Question by @mwafi之后,我们为我们的案例找到了解决方案:
我们正在传递路线权限,如下所示:
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);
}
}