目录
[TOC]
HTTP 中间件提供了一个方便的机制来过滤进入应用程序的 HTTP 请求。例如对请求进行身份认证,对请求的数据进行分析筛选。
## 新建中间件
你可以在 app/Middleware 目录或其子目录中新建中间件,一个中间件的代码实例如下所示:
```php
<?php
namespace App\Middleware;
use WorkerF\Http\MiddlewareInterface;
use WorkerF\Http\Requests;
// 必须实现 MiddlewareInterface 接口
class AppMiddleware implements MiddlewareInterface
{
// 实现 MiddlewareInterface 规定的 handle 方法
public function handle(Requests $request)
{
return $request;
}
}
```
中间件必须实现 WorkerF\Http\MiddlewareInterface 接口,实现接口规定的 handle 方法。
### 中间件通过
如果请求通过验证,则返回请求对象以继续程序执行。
```
public function handle(Requests $request)
{
// 验证操作...
// 通过验证
return $request;
}
```
### 中间件停止
如果请求未通过验证,返回一个闭包阻止程序继续执行。
```
public function handle(Requests $request)
{
// 验证操作...
// 验证失败
return function() {
return 'Invalid request!';
};
}
```
### 实例
```php
<?php
namespace App\Middleware;
use WorkerF\Http\MiddlewareInterface;
use WorkerF\Http\Requests;
use WorkerF\Http\Route;
class AppMiddleware implements MiddlewareInterface
{
public function handle(Requests $request)
{
if ($request->age < 18) {
// 验证失败,重定向路由到其它页面
return Route::redirect('/notAllow'); // Route::redirect() 方法返回一个闭包
}
return $request;
}
}
```
## 注册中间件
使用中间件之前需要注册你新建的中间件,你可以在配置文件 config/middleware.php 中注册你的中间件。
### 全局中间件
全局中间件会在每一个请求中执行。
config/middleware.php 中:
```php
// ...
'global' => [
// 在这里注册全局中间件
App\Middleware\AppMiddleware::class,
],
// ...
```
你可以注册多个中间件,它们会按照顺序依次执行。
### 路由中间件
路由中间件会在访问设置该中间件的路由时执行。
config/middleware.php 中:
```php
// ...
'route' => [
'auth' => App\Middleware\AuthMiddleware::class,
'jwt' => App\Middleware\JwtMiddleware::class,
],
// ...
```
然后在路由中:
```php
Route::group(['middleware', => 'auth'], function() {
Route::get('user', TestController@user);
});
```
你可以注册多个路由中间件,它们会按照 Route 分组从外到内依次执行。