我在 Guzzle 3(在 Goutte 1.0.6 中)中使用事件订阅者来测试 HTTP 操作,而无需实际运行它们。因此,如果我想查看 404 中发生了什么,我只需这样做:
class SavedPageLoaderPlugin implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
'request.before_send' => 'onRequestBeforeSend',
);
}
/**
* Handles a Guzzle event before an HTTP op is attempted
*
* @param \Guzzle\Common\Event $event
* @throws \WebScraper\PauseException
*/
public function onRequestBeforeSend(Event $event)
{
// @var $request Guzzle\Http\Message\Request
$request = $event['request'];
// {{ Fetch $html and $htmlPage, removed for brevity }}
// Set a notification message for all subscribers, then set response
$response = new Response(
404,
$this->convertHeadersIntoKeyedArray($httpPage->getHeaders())
);
$response->setBody($html);
$request->setResponse($response);
}
}
我发现这非常适合模拟失败 (4xx/5xx) 和成功的操作 (2xx),Guzzle 正确地在我的其他插件上正确调用成功/失败事件。
但是,我不确定如何在超时或连接被拒绝的情况下执行此操作,两者都没有响应(或状态代码)。我试过null
作为第一个参数Response
,但这不会触发任何事件;我假设这与真正的超时不同。
更新:我刚刚在 MockPlugin中注意到 Request 类有一个getEventDispatcher()
方法,该方法又返回一个EventDispatcher
带有dispatch()
方法的类。这听起来值得研究——我需要做的就是查看真正的超时或连接拒绝触发了哪些事件,然后自己将它们放入自定义插件中。
如果我有任何工作,我会在这里添加一个解决方案。