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什么东西,执行顺序都能正常。