Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Symfony lint:container fails to match callable created by factory #35863

Copy link
Copy link
Closed
@stloyd

Description

@stloyd
Issue body actions

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      Morty Proxy This is a proxified and sanitized view of the page, visit original site.