【问题标题】:Logging headers added in a middleware在中间件中添加的日志头
【发布时间】:2019-09-07 06:38:28
【问题描述】:

我有一个 GuzzleClientLoggingHandler 如下:

class GuzzleClientLoggingHandler
{
    /** @var HandlerStack */
    private $handlerStack;

    public function __construct(HandlerStack $handlerStack)
    {
        $this->handlerStack = $handlerStack;
    }

    public function log(): HandlerStack
    {
        $logger = Logger::getLogger(__CLASS__);

        $middleware = Middleware::log($logger, $this->request());
        $this->handlerStack->unshift($middleware);

        $middleware = Middleware::log($logger, $this->response());
        $this->handlerStack->unshift($middleware);

        return $this->handlerStack;
    }
}

我的客户看起来像:

new Client([
    'base_uri' => 'https://example.com',
    'handler' => (new GuzzleClientLoggingHandler($handlerStack))->log()
]);

和变量$handlerStack有n个中间件,例如:

$handlerStack->unshift(new LanguageMiddleware());

在中间件 LanguageMiddleware 中我为每个请求设置了一个标头

public function __invoke(callable $handler)
{
    return function (RequestInterface $request, array $options) use ($handler) {
        $request = modify_request($request, [
            'set_headers' => [
                'Accept-Language' => Session::get('language')
            ]
        ]);

        return $handler($request, $options);
    };
}

还有一个问题:如何使用更改/设置的标头记录此请求? 现在中间件中的所有请求修改都不会出现在日志中。

【问题讨论】:

    标签: php http guzzle


    【解决方案1】:

    您需要更改堆栈中中间件的顺序。看看the docs,里面有很好的解释中间件是如何应用于请求和响应的(注意顺序!)。

    因此,要记录应用了所有修改的请求,您需要使用->push() 而不是->unshift() 将中间件放在堆栈的末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多