Я использую 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
вообще не использует методы этого сервиса.