Ленивый сервис игнорируется в контейнере Symfony DI - PullRequest
0 голосов
/ 24 июня 2019

Я использую DI Symfony без фреймворка Symfony.

Это часть composer.json

"require" : {
    "doctrine/orm" : "*",
    "doctrine/migrations" : "^1.5",
    "gedmo/doctrine-extensions" : "*",
    "symfony/dependency-injection" : "3.4.17",
    "symfony/config" : "3.4.17",
    "symfony/yaml" : "3.4.17",
    "twig/twig" : "^2.0",
    "symfony/form": "^3.4",
    "symfony/validator": "^3.4",
    "symfony/doctrine-bridge": "^3.4",
    "symfony/serializer": "^3.4",
    "ramsey/uuid": "^3.8",
    "ramsey/uuid-doctrine": "^1.5",
    "monolog/monolog": "^1.24",
    "wazaari/monolog-mysql": "^1.0",
    "twilio/sdk": "^5.28",
    "mobiledetect/mobiledetectlib": "^2.8",
    "symfony/console": "~3.4.23",
    "guzzlehttp/guzzle": "^6.3",
    "lcobucci/jwt": "^3.2",
    "symfony/cache": "^3.4",
    "symfony/finder": "^3.4",
    "beberlei/DoctrineExtensions": "^1.1",
    "symfony/http-foundation": "^3.4",
    "sinergi/browser-detector": "^6.1",
    "mpdf/mpdf": "~8.0",
    "symfony/proxy-manager-bridge": "^3.4"
},

Так создается контейнер DI

    if (file_exists($containerFile)) {
        require_once($containerFile);
        $container = new \ProjectServiceContainer();
    } else {
        $container = new ContainerBuilder();
        $container->setProxyInstantiator(new RuntimeInstantiator());

        $loader = new YamlFileLoader($container, new FileLocator(__DIR__));
        $loader->load(__DIR__.'/../config/services.yml');

        $container->compile();

        $dumper = new PhpDumper($container);
        $containerDir = dirname($containerFile);
        file_put_contents($containerFile, $dumper->dump());
    }

Inconfig / services.yml Я пометил службу как lazy

  App\Services\MyService:
    public: true
    lazy: true

Когда я запускаю some command в первый раз, он создает прокси-объект для MyService, когда я запускаю some command во второй разон берет MyService из cache/container.php и не ленится.

Часть сгенерированного cache/container.php

    protected function getMyServiceService($lazyLoad = true)

Фактическая проблема заключается в том, что переменная $lazyLoad вообще не используетсявнутри этой функции вызывается конструктор MyService, но его следует отложить, поскольку some command вообще не использует методы этого сервиса.

...