Переопределение контроллера в Symfony 4.4 (украшает) - «Вы запросили несуществующую услугу» - PullRequest
0 голосов
/ 05 мая 2020

У меня есть Bundle с именем Jason / JasonSticksBundle, а внутри у меня есть контроллер с именем StickController.

У меня есть служба, определенная в Jason / JasonSticksBundle / Resources / config / services.yaml

Jason\JasonSticksBundle\Controller\StickController:
        public: true
        arguments: []
        tags: ['controller.service_arguments']

Мой services.yaml загружается через JasonSticksExtension-> load (), и мой пакет регистрируется в пакетах. php.

Пакет работает нормально как есть.

НО

Для этого конкретного проекта я хочу переопределить некоторые методы в StickController, поэтому я пытаюсь «украсить» его .

Внизу моего обычного services.yaml поэтому у меня есть следующее:

App\Controller\StickController:
    decorates: Jason\JasonSticksBundle\Controller\StickController

но я получаю эту ошибку

Вы запросили не- существующая служба "Jason \ JasonSticksBundle \ Controller \ StickController".

Наконец, если я запустил

php bin/console debug:container

, я смогу увидеть свою службу

Jason\JasonSticksBundle\Controller\StickController                              Jason\JasonSticksBundle\Controller\StickController   

Все Я могу представить, что мой services.yaml регистрируется до регистрации моего StickBundle, поэтому он не существует в нужное время. Но я не знаю, как изменить порядок этого, и будет ли это вообще жизнеспособный вариант?

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 06 мая 2020

Я нашел обходной путь, но не решен. Это определенно не способ сделать это - украшение существует по какой-то причине, и я не уверен, почему я не могу заставить его работать, поэтому любые советы по этому поводу все равно будут оценены.

Для моего обходного пути:

Я удалил определения своих контроллеров из моего Bundles services.yaml и отредактировал свой ConfigTreeBuilder моего класса конфигурации пакетов, чтобы включить в него поле scalarNode, позволяющее передавать имя класса - это имя класса будет заменять контроллер пакеты.

Затем, чтобы зарегистрировать службы контроллера без использования services.yaml, я изменил свой класс JasonStickExtension и после загрузки файла services.yaml (все еще необходимого для других служб) добавил следующее:

$stickControllerDefinition = $container->findDefinition('Jason\JasonSticksBundle\Controller\StickController');
$stickControllerDefinition->addTag("controller.service_arguments");
$stickDec = $config['stick_controller_class'];
  if($stickDec!=null) {
      $stickControllerDefinition->setClass($stickDec);
   }

Это прямой способ сделать это, и, как я уже сказал, я действительно не думаю, что это правильный способ.

...