在测试我的Guzzle客户端时达到了“100”的最大功能嵌套级别?

时间:2013-07-17 12:53:17

标签: php recursion phpunit runtime-error guzzle

我对Guzzle内部的基本理解可能是导致此错误的原因(PHPUnit测试):

  

PHP致命错误:达到了“100”的最大函数嵌套级别,   中止!在   \供应商\狂饮\狂饮的\ src \狂饮\ HTTP \ QueryString.php   在第234行

以下部分(插件和解析器)似乎互相调用。 插件正在侦听command.before_send事件,为request.exception事件添加了一个闭包作为侦听器:

/**
 * The plugin adds a closure listener for the event 'response.exception'. The
 * closure is using the parser (RestInterfaceParser).
 */
class ResponseListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array('command.before_send' => 'onCommandBeforeSend');
    }

    public function onCommandBeforeSend(Event $event)
    {
        // ...
        $command = $event['command'];
        $request = $command->getRequest();

        $request->getEventDispatcher()->addListener(
            'request.exception',
            function (Event $event) use ($command, $parser) {
                $parsed = $parser->parse($command);

                // ...
            }
        );
    }
}

到目前为止没什么特别的!当我尝试访问响应对象时,错误是由解析器引起的:

/**
 * The parser invoked by the closure listener.
 */
class RestInterfaceParser implements ResponseParserInterface
{
    public function parse(CommandInterface $command)
    {
        var_dump($command->getResponse());
    }
}

删除该行会删除错误。但是,非常惊讶,我需要解析器中的响应对象。增加嵌套级别(xdebug.max_nesting_level = 1000)没有用,因为它在这里是“纯粹的”递归。

1 个答案:

答案 0 :(得分:0)

找到了一个关于班级DefaultResponseParser的解决方案:

$command->getRequest()->getResponse();

访问响应对象的正确方法。确实很混乱。