在中间件中获取Laravel Dynamic Route参数

时间:2018-05-30 08:22:30

标签: routes laravel-5.6 laravel-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?}");

我们有什么办法可以将动态路由变量传递给中间件吗?

1 个答案:

答案 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);
    }
}