Php 在中间件中添加日志头
我有一个GuzzleClientLoggingHandler,如下所示:Php 在中间件中添加日志头,php,http,guzzle,Php,Http,Guzzle,我有一个GuzzleClientLoggingHandler,如下所示: class GuzzleClientLoggingHandler { /** @var HandlerStack */ private $handlerStack; public function __construct(HandlerStack $handlerStack) { $this->handlerStack = $handlerStack; }
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);
};
}
还有一个问题:如何用更改/设置的头记录这个请求?
现在,中间件中的所有请求修改都不会出现在日志中。您需要更改堆栈中中间件的顺序。看一看,关于如何将中间件应用于请求和响应(注意顺序!),有一个很好的解释 因此,要记录应用了所有修改的请求,您需要使用
->push()
而不是->unshift()
将中间件放在堆栈的末尾