laravel 5.0 升级 6.18 之 router::filter 到 middleware 的改造

文章目录

    laravel filter 的原始意义

    这是 laravel 4.x 及 5.0 中的概念

    https://laravel.com/docs/4.2/routing#route-filters

    Route filters provide a convenient way of limiting access to a given route, which is useful for creating areas of your site which require authentication.

    filter 与 middleware 的对比

    按照 laravel 6 文档的说法,middleware 就是原 4.x 版本 filter 的升级替代品。

    Middleware provide a convenient mechanism for filtering HTTP requests entering your application. All of these middleware are located in the app/Http/Middleware directory.

    使用方法对比

    laravel 6 middleware:

    php artisan make:middleware CheckAge
    namespace App\Http\Middleware;
    
    use Closure;
    
    class CheckAge
    {
        public function handle($request, Closure $next)
        {
            if ($request->age <= 200) {
                return redirect('home');
            }
    
            return $next($request);
        }
    }
    

    laravel 4.x filter:

    // 定义在 app/filters.php 文件中
    Route::filter('old', function()
    {
        if (Input::get('age') < 200)
        {
            return Redirect::to('home');
        }
    });
    
    // route 中使用
    Route::get('user', array('before' => 'old', 'uses' => 'UserController@showProfile'));
    

    before,after 在 filter 与 middleware 中的不同处理方法

    filter 是在路由中使用 before 关键字来标识到底是在请求前,还是请求后走 filter 的逻辑。

    而 middleware 则是通过代码的插入位置来决定是 before 还是 after request 执行。

    // Before: Perform action
    $response = $next($request);
    // After: Perform action
    return $response;
    

    laravel 6 middleware 在 route 中的使用方法

    首先在 app/Http/Kernel.php 中注册,例如:

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    ];
    

    然后修改 route 文件:

    Route::get('admin/profile', function () {
        //
    })->middleware('auth');     // 若是多个 middleware: middleware('first', 'second');
    

    web 和 api 则是两个 middleware group,也定义在 kernel.php 中。

    是否还需要处理 app/Providers/RouteServiceProvider.php

    5.0 升级 5.2 中,有这么段描述:

    将过滤器逻辑绑定从 app/filters.php 复制到 app/Providers/RouteServiceProvider.php 的 boot() 方法。并在 app/Providers/RouteServiceProvider.php 添加 use Illuminate\Support\Facades\Route; 来继续使用 Route Facade。那些在路由或控制器内有使用到旧有默认过滤器的 (例如,[‘before’ => ‘auth’]) 请修改使用新的中间件 (例如,[‘middleware’ => ‘auth’])。

    看了一遍 lavavel 6 中的 RouteServiceProvider.php 文件,看上去不需要改动。

    参考

    • middleware 文档 https://laravel.com/docs/6.x/middleware
    • route filter 文档 https://laravel.com/docs/4.2/routing#route-filters
    • 5.0 升级 5.2 说明 https://learnku.com/docs/laravel/5.2/upgrade/1091#e8bffd
    • service provider 的简述 https://sunnyingit.github.io/book/section_php/sericeprovider.html

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式