中间件组的定义及使用


不管你创建的Laravel应用体量有多大,路由文件routes.php的体积都会随之变得越来越大。对我而言创建一个新应用首先要做的就是根据业务逻辑对路由文件进行拆分和分组,比如“admin”、“auth”、“public”等。通常分组的每个部分都有其对应的中间件设置,例如,admin会用到一个auth中间件,API分组可能会有不同的auth中间件,并且会有指定的限制访问频率的中间件。

Laravel 5.2 引入了中间件组的概念,这是一个为路由规则使用多个中间件的快捷方式,只需要定义一个中间件组key即可。

注:即使你不想使用中间件组,也可以继续往下看,因为这是Laravel全局中间件堆栈的一次重大改变。

所以还记得上面提到的admin的那个例子吗?现在我们可以为其创建一个“admin”中间件组,下面我们就来细说如何创建并使用中间件组。

1、定义中间件组

你可以在 app\Http\Kernel.php中定义中间件组,该类中有个新数组属性 $middlewareGroups,该数组的键是中间件组的名字,值是对应的中间件。

Laravel默认为我们提供了webapi中间件组:

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
    ],
];

正如你所看到的,$middlewareGroups 的键可以是中间件类名也可以是指定路由中间件的别名如 throttleauth,下面我们来创建admin中间件组:

protected $middlewareGroups = [
    'web' => [...],
    'api' => [...],
    'admin' => [
        'web',
        'auth',
    ]
];

我们已经定义了admin中间件组使用web(另一个中间件组)和auth(路由中间件别名),就是这么简单!

与Laravel 5.1的不同之处

你可能已经注意到了,web中的中间件就是 Laravel 5.1 及之前版本中被应用到每个路由的中间件,这是一个思想上的重大提升:没有被分配web中间件组的路由将不会有cookies、sessions或者CSRF功能。比如只分配api中间件组的路由就是这样。

2、使用中间件组

我们已经创建了中间件组,接下来该如何使用它呢?

如果你看过 Laravel 5.2 的routes.php将会很清楚:

Route::get('/', function () {
    return view('welcome');
});

Route::group(['middleware' => ['web']], function () {
    //
});

正如你所看到的,你可以像使用路由中间件一样使用中间件组:既可以设置为指定的中间件,也可以是中间件数组,所以我们可以这样使用中间件组admin

Route::group(['middleware' => 'admin'], function () {
    Route::get('dashboard', function () {
        return view('dashboard');
    });
});

就是这么简单!