0

将所有 guzzle 请求记录到 php 调试栏的最佳方法是什么?

通常会触发某种类型的事件,我可以监听这些事件并将数据传递给调试栏的收集器。但是,guzzle 似乎没有任何事件。相反,它使用的是中间件和处理程序,我不太了解如何与调试栏集成以将请求和时间线、执行持续时间信息记录到调试栏。

4

1 回答 1

0

我想我基本上已经弄清楚了。

我创建了自己的中间件并将其注册到客户端。

自定义中间件。

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 的工作流程。一旦我这样做了,一切就变得更有意义了。

于 2017-02-02T15:25:47.757 回答