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

更新日期: 2020-07-20 阅读次数: 3054 字数: 460 分类: Laravel

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 聊聊, 查看更多联系方式