0

Guzzleの内部構造に関する私の非常に基本的な理解が、このエラーの原因である可能性があります (PHPUnit テスト):

PHP 致命的なエラー: 最大関数ネスト レベル '100' に達しました。中止します! \vendor\guzzle\guzzle\src\Guzzle\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) を上げても役に立ちません。

4

1 に答える 1

0

クラスを見て解決策を見つけましたDefaultResponseParser

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

応答オブジェクトにアクセスする正しい方法です。確かにかなり混乱します。

于 2013-07-17T13:01:22.257 に答える