Symfony - используйте сервис из другого пакета

Я пытаюсь использовать службу из другого пакета, не создавая никаких зависимостей между пакетами. Я пытаюсь использовать 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 после анализа аннотаций. Или это просто неправильный подход?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
7
0
1 381
1

Ответы 1

Поскольку @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 на вызовы методов внутри действия.

lookbadgers 19.03.2018 09:31

Другие вопросы по теме