Routes 在中间件中获取Laravel动态路由参数

Routes 在中间件中获取Laravel动态路由参数,routes,laravel-5.6,laravel-middleware,Routes,Laravel 5.6,Laravel Middleware,我们使用Laravel5.6构建了一个CMS。我们制作了各种动态路线,如下所示: route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth'); route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{parameter}'); &

我们使用Laravel5.6构建了一个CMS。我们制作了各种动态路线,如下所示:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth');
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);
    }
}
通过此单一路径,我们可以访问无限数量的已注册分类,如:

http://example.com/taxonomy/category
http://example.com/taxonomy/tag
...
因此,分类参数在我们的路由中是一个可变的东西

现在我们制作了一个中间件,允许用户根据其授予的权限进行操作。使用我们的中间件,前面的路线是:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', 'permissions:manage_{taxonomy?}');
这就是问题所在。我们无法将该变量参数转换为中间件参数。我们需要它,因为用户可以拥有
类别
的权限,但可以“拥有
标记
的权限”。但是通过这种途径,用户无法访问任何一种分类法。整个路线都被封锁了

O、 我们也尝试了双引号:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth', "permissions:manage_{taxonomy?}");
有什么方法可以将动态路由变量传递给中间件吗?

修改后,我们为我们的案例找到了一个解决方案:

我们正在传递路由权限,如下所示:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth');
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);
    }
}
并在中间件中处理权限,如下所示:

route::get('taxonomy/{taxonomy?}', 'TaxonomyController@list')->middleware('auth');
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);
    }
}