在中间件中获取 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);
    }
}