Я пытаюсь использовать службу из другого пакета, не создавая никаких зависимостей между пакетами. Я пытаюсь использовать CompilerPass, но это может быть не лучший метод.
Я создал ParamConverter в BarBundle, который FooBundle должен использовать для своих контроллеров.
Однако я получаю сообщение об ошибке: No converter named foo_bundle.converter_service found for conversion of parameter fooObject
Что у меня есть на данный момент:
приложение / config / config.yml
foo_bundle:
converter_service: bar_bundle.converter.object
SRC / BarBundle / config / service.yml
services:
bar_bundle.converter.object:
class: BarBundle\ParamConverter\ObjectParamConverter
tags:
- { name: request.param_converter, priority: 0, converter: bar_bundle.converter.object }
SRC / FooBundle / DependencyInjection / FooBundleExtension.php
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('services.yml');
$container->setParameter('foo_bundle.converter_service.id', $config['converter_service']);
}
src / FooBundle / FooBundle.php
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new CompilerPass());
}
SRC / FooBundle / DependencyInjection / CompilerPass.php
public function process(ContainerBuilder $container)
{
$convertserService = $container->getDefinition($container->getParameter('foo_bundle.converter_service.id'));
$container->setDefinition('foo_bundle.converter_service', $convertserService);
}
Аннотация контроллера:
/**
* Show Feed document.
*
* @Route("/{id}/add", name = "object_add")
* @ParamConverter("fooObject", converter = "foo_bundle.converter_service")
*/
public function addAction(ObjectInterface $fooObject)
Если я вызываю $container->get('foo_bundle.converter_service') в CompilerPass, я вижу, что объект правильно настроен.
Это приоритетный вопрос? Т.е. запускается ли CompilerPass после анализа аннотаций. Или это просто неправильный подход?






Поскольку @ParamConverter также загружаются вместе с CompilerPass, вам, вероятно, придется сначала принудительно выполнить свой.
Обратите внимание, что приоритет передачи компилятора по умолчанию равен 0, и чем раньше он выполняется, тем выше приоритет.
Попробуй это :
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new CompilerPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 30);
}
Я вижу, что это должно работать, прочитав документы symfony.com/doc/3.4/components/dependency_injection/…, но я все равно получаю сообщение об ошибке
No converter named foo_bundle.converter_service found for conversion of parameter fooObject. Думаю, я попробую другой подход, разделив paramConverter на вызовы методов внутри действия.