Closed
Description
Symfony version(s) affected: 4.4.4
Description
When calling the lint:container
on complex setup of services when one is creating callable
that is passed as argument to another it fails in strange way.
How to reproduce
bin/console lint:container
In CheckTypeDeclarationsPass.php line 263:
Invalid definition for service "Some\Service": argument 1 of "GuzzleHttp\HandlerStack::push" accepts "callable", "call
able" passed.
<service id="Some\Service">
<argument type="service" id="guzzle_client"/>
</service>
<service id="guzzle_client" class="GuzzleHttp\Client">
<argument type="collection">
<argument key="handler" type="service" id="some.guzzle.stack" />
</argument>
</service>
<service id="some.guzzle.stack" class="GuzzleHttp\HandlerStack">
<factory class="GuzzleHttp\HandlerStack" method="create" />
<call method="push">
<argument type="service" id="some.guzzle.logger" />
</call>
</service>
<service id="some.guzzle.logger" class="callable">
<factory class="Guzzle\Middleware\JsonFormatterMiddleware" method="log" />
<argument type="service" id="some.logger" />
<argument>100</argument>
</service>
<service id="some.logger" class="Symfony\Bridge\Monolog\Logger">
<argument index="0">log_name</argument>
<call method="pushHandler">
<argument type="service" id="logger_handler" />
</call>
</service>
Factory class:
class JsonFormatterMiddleware
{
public static function log(LoggerInterface $logger, string $logLevel = LogLevel::INFO): callable
{
return static function (callable $handler) use ($logger, $logLevel) {
return static function ($request, array $options) use ($handler, $logger, $logLevel) {
return $handler($request, $options)->then(
static function ($response) use ($logger, $request, $logLevel) {
$logger->log($logLevel, static::getMessage($request));
return $response;
},
static function ($reason) use ($logger, $request) {
$logger->log(
$reason instanceof RequestException ? LogLevel::ERROR : LogLevel::NOTICE,
static::getMessage($request)
);
return rejection_for($reason);
}
);
};
};
}
private static function getMessage(RequestInterface $request): string
{
return \trim($request->getMethod().' '.$request->getRequestTarget()).' HTTP/'.$request->getProtocolVersion();
}
}
Possible Solution
lint:container
call should not report this as issue or should be able to determine that callable
from factory call is callable
.
Additional context
In overall that setup works well since really old versions of Symfony, the service & callables are created, handled & proceed correctly, without any issue.