thinkphp6 前置和后置中间件的区别以及特殊情况

hykeda12个月前ThinkPHP1058

首先官方文档是这么描述的:

中间件是在请求具体的操作之前还是之后执行,完全取决于中间件的定义本身。

下面是一个前置行为的中间件 (Before命名是随意的):

PHP
<?php

namespace app\middleware;

class Before
{
    public function handle($request, \Closure $next)
    {
        // 添加中间件执行代码

        return $next($request);
    }
}

下面是一个后置行为的中间

PHP
<?php

namespace app\middleware;

class After
{
    public function handle($request, \Closure $next)
    {
		$response = $next($request);

        // 添加中间件执行代码

        return $response;
    }
}

首先区别是:在前置中间件中使用 $request->controller() 获取不到访问的控制器名,而在后置中间件中则可以正常获取到

在前置中间件打印 $request 发现是获取不到访问的控制器和方法名

另外的区别是执行的顺序,但是我在实际的使用中发现一个问题

PHP
<?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;

    }
}

按照官方文档这个是一个后置的中间件,我在控制器中调用:

PHP
public function rss(){
    echo '控制器执行的代码'.PHP_EOL;
    return arrayToJson('',false,'文章不存在');
}

输出的结果为:

PHP
中间件开始
控制器执行的代码
中间件结束
{"result":{"success":false,"info":"文章不存在"}}

这样的结果是正常的使用结果,后置方法中的中间件结束确实是在控制器执行完以后才被执行。没有问题。

但是如果我在控制器中注释掉return,这个时候后置就失去了效果。

PHP
public function rss(){
    echo '控制器执行的代码'.PHP_EOL;
    // return arrayToJson('',false,'文章不存在');
}

现在的输出结果是:

PHP
中间件结束 中间件开始 控制器执行的代码

这里的执行顺序就错误了。具体还不知道是什么原因,是先执行了结束,再执行开始,最后执行控制器。这里甚至连换行都没有了。

只要在控制器中 加入return,不管是return什么东西,执行顺序都能正常。

阅读剩余的49%

相关文章

thinkphp5 报错级别设置,屏蔽警告

本着严谨的原则,5.0版本默认情况下会对任何错误(包括警告错误)抛出异常,如果不希望如此严谨的抛出异常,可以在应用公共函数文件中(common.php)或者配置文件中使用error_report...

thinkphp5 微信token验证不通过

刚想接入下微信公众平台,用了最新的tp5,之前用的是tp3.2.3,发现配置好文件后,微信后台一直提示token验证失败。 但是直接在入口文件写echo $_GET["echostr"];就会提...

thinkphp项目接入阿里云OSS

1、首先安装 sdk:composer require aliyuncs/oss-sdk-php安装好后,在控制器中创建上传方法:protected function upload...

phpExcel 官方停止更新,不支持php7.4以上版本,改用 phpspreadsheet

composer require phpoffice/phpspreadsheet安装后:按需要引入文件use PhpOffice\PhpSpreadsheet\Spre...

在thinkphp6.1.1中composer安装 liliuwei/thinkphp-jump报错

报错内容:Problem 1     - Root composer.json requires liliu...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。