# 1.8 中间件使用
## 1.8.1 简介
中间件可以在请求开始或结束时提前对请求进行处理,相对于控制器来说,中间件是全局且优先级更高的一种处理请求的方式,也更高级一些。
## 1.8.2 创建一个中间件
中间件可以位于任何命名空间下,并且名称可以随意。
一个中间件必须继承 `\X\Middleware` 类。
一个中间件有且必须有两个方法,分别是 `handle` 和 `response` ,且一般不允许有其它方法。
`handle` 方法的参数有两个,第一个是 Event 触发时的 Event 实例,详见 http://event.thephpleague.com/ 。第二个是 `\X\Request` 的实例,是请求数据。
`response` 方法的参数也有两个,第一个和 `handle` 一致,第二个是 `\X\Response` 的实例,是控制器返回的响应的数据。
在中间件中,可以对这些数据进行修改,也可以直接通过 `$this->app` 访问到 `\X\Application` 的实例,对程序进行初始化,也可以通过 `$this->app->handler` 获取到 Handler 实例,对请求进行进一步控制。
一个示例的中间件:
```php
<?php
/**
* XPHP - PHP Framework
*
* This project is licensed
* under MIT. Please use it
* under the license and law.
*
* @category Framework
* @package XPHP
* @author Tianle Xu <xtl@xtlsoft.top>
* @license MIT
* @link https://github.com/xtlsoft/XPHP
*
*/
namespace X\Middleware;
class HttpError extends \X\Middleware {
public function handle($event, \X\Request $request){
// Do Nothing...
}
public function response($event, \X\Response $response){
if(substr($response->dump()->status, 0, 1) != 2){
$view = $this->app->container->get("Core.View");
$httpcode = new \X\Handler\Http;
$httpcode = $httpcode->statusMap;
$rslt = $view->render("System/HttpError", [
"status" => $response->dump()->status,
"header" => $response->dump()->header,
"message"=> $httpcode[$response->dump()->status],
"request"=> $this->app->request->getArray()
]);
$response->write($rslt);
}
}
}
```
这个中间件会在HTTP响应代码不是200时自动调用 `System/HttpError` 的 View,显示友好错误处理界面。
## 1.8.3 注册中间件
至此为止,虽然我们创建了中间件,但是XPHP框架还并不知道有这个中间件。要使他生效,我们需要修改 `Register.php` 或 `Config.php` (推荐后者),在主函数体中加入一句话:
```php
$App->boot('中间件的类名');
```
然后,XPHP框架就会自动加载并启用该中间件。
就是这么简单,学会了吧?