HTTP 中间件为过滤访问你的应用的 HTTP 请求提供了一个方便的机制。例如,Laravel 默认包含了一个验证用户的中间件。如果没有经过身份验证,中间件将会将用户重定向至登录页面。然而,如果用户经过了验证,中间件将会允许请求继续在应用中执行下去。
当然,除了身份验证,中间件也可以被用来执行多种多样的任务。一个 CORS 中间件可能负责在所有应用发出去的响应中加入适当的头部。一个日志中间件可能记录所有发送给应用的请求的日志。
Laravel 框架已经自带了一些中间件,包括维护、身份验证、 CSRF 保护等等。所有中间件都位于 app/Http/Middleware
文件夹中。
php artisan make:middleware OldMiddleware
public function handle($request, Closure $next) { if ($request->input('age') <= 200) { return redirect('home'); } return $next($request); }
正如你看到的,如果用户给出的 age
小于或等于 200
,中间件会给客户端返回一个 HTTP 重定向;否则,请求会继续在应用程序中执行下去。只用调用带有 $request
的$next
方法,就可以将请求继续在应用中传递到更深层的逻辑(允许跳过中间件)。
在抵达应用程序之前,请求层层通过一系列中间件是最好的设计。每一层可以对其进行检查,甚至是完全拒绝请求。
一旦中间件在 HTTP kernel 文件中被定义,你可以在路由选项数组中使用 middleware
键来指派:
Route::get('admin/profile', ['middleware' => 'auth', function () { //}]);
Route::get('/', ['middleware' => ['first', 'second'], function () { //}]);
Route::get('/', function () { //}])->middleware(['first', 'second']);
public function handle($request, Closure $next, $role) { if (! $request->user()->hasRole($role)) { // Redirect... } return $next($request); }
中间件参数可以在定义路由时将中间件的名称和参数用 :
隔开来指定。多个参数应当用逗号隔开:
Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) { //}]);