2013-07-17 52 views
0

我的Guzzle內部也許這個錯誤(PHPUnit的測試)的原因非常基本的理解:在測試我的Guzzle客戶端時達到了'100'的最大功能嵌套級別?

PHP Fatal error: Maximum function nesting level of '100' reached, aborting! in \vendor\guzzle\guzzle\src\Guzzle\Http\QueryString.php on line 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)不會有幫助,因爲它在這裏是「純粹」遞歸。

+0

你確定你正在處理你期待的對象嗎?轉儲對象,不僅是getResponse()的結果。並做更多的調試。理解你的問題的問題是,我們沒有看到更多的代碼。實際上,我不知道接口和類是從哪裏來的。 – Sven

+0

@Sven我找到了一個解決方案(我已經發布了答案)...是的,我沒有正確處理命令對象。 – gremo

回答

0

找到了解決辦法看着DefaultResponseParser類:

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

是正確的方法來訪問響應對象。確實令人困惑。

+0

是的,這會起作用。您看到無限遞歸的原因是因爲響應僅在請求成功時在命令對象上設置。否則,它會嘗試再次發送請求。您還可以使用'request.exception'事件發出的Event的'response'上下文值。 –

+0

@MichaelDowling謝謝你的確認。請介意我是否要求你幫助解決這個問題? http://stackoverflow.com/questions/17705907/changing-parameter-values-of-guzzle-commands-at-runtime-through-plugins – gremo

相關問題