thinkphp6 前置和后置中间件的区别以及特殊情况
首先官方文档是这么描述的:
中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身。
下面是一个前置行为的中间件 (Before命名是随意的):
<?php namespace app\middleware; class Before { public function handle($request, \Closure $next) { // 添加中间件执行代码 return $next($request); } }
下面是一个后置行为的中间件
<?php namespace app\middleware; class After { public function handle($request, \Closure $next) { $response = $next($request); // 添加中间件执行代码 return $response; } }
另外的区别是执行的顺序,但是我在实际的使用中发现一个问题
<?php declare (strict_types = 1); namespace app\middleware; use app\controller\Common; class CheckIp extends Common { /** * 处理请求 * * @param \think\Request $request * @param \Closure $next * @return Response */ public function handle($request, \Closure $next) { // 添加中间件执行代码 echo '中间件开始'.PHP_EOL; $response = $next($request); // 添加中间件执行代码 echo '中间件结束'.PHP_EOL; return $response; } }
按照官方文档这个是一个后置的中间件,我在控制器中调用:
public function rss(){ echo '控制器执行的代码'.PHP_EOL; return arrayToJson('',false,'文章不存在'); }
输出的结果为:
中间件开始 控制器执行的代码 中间件结束 {"result":{"success":false,"info":"文章不存在"}}
这样的结果是正常的使用结果,后置方法中的中间件结束确实是在控制器执行完以后才被执行。没有问题。
但是如果我在控制器中注释掉return,这个时候后置就失去了效果。
public function rss(){ echo '控制器执行的代码'.PHP_EOL; // return arrayToJson('',false,'文章不存在'); }
现在的输出结果是:
中间件结束 中间件开始 控制器执行的代码
这里的执行顺序就错误了。具体还不知道是什么原因,是先执行了结束,再执行开始,最后执行控制器。这里甚至连换行都没有了。
只要在控制器中 加入return,不管是return什么东西,执行顺序都能正常。