基于laravel路由参数的中间件

Middleware based on laravel route parameter

我有这样的路线:

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

这里可以根据路由参数类型使用动态中间件吗

喜欢如果类型是查询那么中间件应该是'can:enquiries-index',类似的成员'can:members-index'

我知道这可以在控制器函数中使用授权方法完成,但我只在路由文件中使用所有授权。所以只想把它放在这里。

我正在使用 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

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

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')