【问题标题】:Middleware based on laravel route parameter基于 laravel 路由参数的中间件
【发布时间】:2020-08-31 06:25:38
【问题描述】:

我有这样的路线:

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

【问题讨论】:

    标签: php laravel laravel-7


    【解决方案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')

    【讨论】:

    • 为什么不制作一个并检查里面呢?
    • 关注点分离@vivek_23
    • @vivek_23 但是当你写的时候我发现了一个错误——这个很容易被消耗掉而不修改任何类。
    • @Ersoy 我可以访问 Providers 中的路由参数吗?因为我使用 Gate 定义来授权路由。检查更新的问题。
    • @SunnyKumar 您可以尝试通过在 ServiceProvider 中使用 request()->route()->parameter('type') 访问 - 请求可以得到解决。
    猜你喜欢
    • 2019-04-08
    • 2016-02-14
    • 2019-06-16
    • 2020-03-07
    • 1970-01-01
    • 2019-09-29
    • 2017-01-24
    • 2015-12-27
    • 2017-04-06
    相关资源
    最近更新 更多