Symfony2. Заставить службу получить экземпляр

Я работаю с Symfony 2.8, я сталкиваюсь с ситуацией, когда служба должна быть запущена, даже если она где-то не запрашивается.

Зачем ? Потому что эта базовая служба настраивает помеченные службы, которые передаются вызовом метода в Core (я сделал это на этапе компиляции).
И затем, если я запрашиваю одну из этих помеченных служб без запроса Core, она не будет настроена и затем будет непригодна для использования.

Вот пропуск компилятора:

$coreDefinition = $container->findDefinition(
'app.improvements.core'
);

$taggedAppliers = $container->findTaggedServiceIds('app.improvement.applier');

foreach ($taggedAppliers as $id => $tags) {
$coreDefinition->addMethodCall(
'registerApplier',
[new Reference($id)]
);
}

$taggedImprovements = $container->findTaggedServiceIds(
'app.improvement'
);

// Only method found to initialize improvements.
foreach ($taggedImprovements as $id => $tags) {
$coreDefinition->addMethodCall(
'registerImprovement',
[new Reference($id)]
);
}

Подводя итог, Заявители регистрируют Улучшения, а Основные регистрируют Заявителей. Ядро ассоциирует улучшения с аппликаторами, поскольку каждое улучшение должно быть зарегистрировано в определенном апплере, который хранится в ядре.

Проблема в том, что когда я запрашиваю только Applier, его улучшения не регистрируются в нем, потому что ядро ​​не создается.

Спасибо.

1

Решение

Помимо проблем проектирования, самый простой способ создать экземпляр службы — это использовать слушатель событий. В вашем случае вы бы слушали kernel.request и вытащить свой сервис из контейнера.

class RequestListener
{
public function onKernelRequest(GetResponseEvent $event)
{
$event->getKernel()->getContainer()->get('service_id');
}
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector