将所有 guzzle 请求记录到 php 调试栏的最佳方法是什么?
通常会触发某种类型的事件,我可以监听这些事件并将数据传递给调试栏的收集器。但是,guzzle 似乎没有任何事件。相反,它使用的是中间件和处理程序,我不太了解如何与调试栏集成以将请求和时间线、执行持续时间信息记录到调试栏。
将所有 guzzle 请求记录到 php 调试栏的最佳方法是什么?
通常会触发某种类型的事件,我可以监听这些事件并将数据传递给调试栏的收集器。但是,guzzle 似乎没有任何事件。相反,它使用的是中间件和处理程序,我不太了解如何与调试栏集成以将请求和时间线、执行持续时间信息记录到调试栏。
我想我基本上已经弄清楚了。
我创建了自己的中间件并将其注册到客户端。
自定义中间件。
use GuzzleHttp\Promise\PromiseInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Rocket\Cockpit\Facade\Container;
use Rocket\Moc\Debugbar\MocDebugBar;
class GuzzleHttpMiddleware {
/** @var callable */
private $nextHandler;
/**
* @param callable $nextHandler Next handler to invoke.
*/
public function __construct(callable $nextHandler) {
$this->nextHandler = $nextHandler;
}
/**
* @param RequestInterface $request
* @param array $options
*
* @return PromiseInterface
*/
public function __invoke(RequestInterface $request, array $options)
{
$fn = $this->nextHandler;
$debugbar = Container::get(MocDebugBar::class);
$debugbar['rest']->addRequest($request);
return $fn($request, $options)
->then(function (ResponseInterface $response) use ($request, $options) {
return $response;
});
}
}
使用处理程序堆栈注册自定义中间件 - 使用 PHP League 容器。
// Register http client.
$this->getContainer()->share(Client::class,function() {
// In theory this "should" be available
$config = load_class('Config');
// Add debugbar middleware to handler stack.
$stack = HandlerStack::create();
$stack->after('prepare_body',function(callable $handler) {
return new GuzzleHttpMiddleware($handler);
},'debugbar');
$client = new Client([
'base_uri'=> $config->item('service_url'),
'handler'=> $stack,
]);
return $client;
},true);
在我真正单独查看 Promise 库之前,我很难理解处理程序和 Promise 的工作流程。一旦我这样做了,一切就变得更有意义了。