基于laravel路由参数的中间件

时间:2020-05-14 16:09:54

标签: php laravel laravel-7

我有一条这样的路线:

Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:user-index']])->where('type', '(members|enquiries)');

我可以根据路由参数类型在此处使用动态中间件。

就像类型查询一样,中间件应该是'can:enquiries-index',对于成员'can:members-index'也是这样。

我知道这可以通过使用authorize方法的控制器功能来完成,但是我仅在路由文件中使用所有授权。所以只想保留这里。

我正在使用Laravel Gates定义来授权路线:

在AuthServiceProvider @ boot中

    Gate::before(function ($user, $ability) {
        $permission = Permission::where('slug', $ability)->first();
        return $user->hasPermissionTo($permission);
    });

Laravel版本:7.9.2

PHP版本:7.2

1 个答案:

答案 0 :(得分:1)

不,您不能做动态中间件,但也不必在控制器中做。您可能会做类似的事情;您将两个中间件绑定到该路由。

Route::get('users/{type}', ['as'=>'users.index', 'uses'=>'UserController@index', 'middleware' => ['can:members-index', 'can:enquiries-index']])->where('type', '(members|enquiries)');

只需检查type是否在该中间件中即可,例如;

// can:enquiries-index middleware class
public function handle($request, Closure $next)
{
    if ($request->route()->parameter('type') === 'enquiries') {
        // enquiries related code blocks
    }
}

// can:members-index middleware class
public function handle($request, Closure $next)
{
    if ($request->route()->parameter('type') === 'members') {
        // members related code blocks
    }
}

编辑:

使用策略时,可以在服务提供商内部使用相同的检查块,例如request()->route()->parameter('type')

相关问题