ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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框架就会自动加载并启用该中间件。 就是这么简单,学会了吧?