Symfony autowire - Какая связь между различными файлами service.yml? - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю над переносом существующего проекта Symfony 2.8 на Symfony 3.4.В этом процессе я хотел бы использовать autowire для автоматической настройки / настройки служб.

Исходя из SF 2, мой проект по-прежнему организован в разных пакетах, и поэтому я использую разные services.yml файлы.

Кажется, что настройки из проектов services.yml не применяются (полностью) к конкретным services.yml пакетным файлам. Интересно, ожидается ли это или что-то не так с моей конфигурацией.

Конкретная проблема:

// app/config/config.yml
imports:
    - { resource: "@AppBundle/Resources/config/services.yml" }
    ...


// app/config/services.yml
services:
    _defaults:
        autowire: true
        autoconfigure: true
        public: false
        bind:
            $debug: '%kernel.debug%'


// src/AppBundle/Resources/config/services.yml
services:
    AppBundle\Controller\CustomExceptionController:
        public: true
        #autowire: true
        #arguments:
        #    $debug: '%kernel.debug%'


// AppBundle\Controller\CustomExceptionController
class CustomExceptionController extends ExceptionController {
    public function __construct(\Twig_Environment $twig, $debug) {
        parent::__construct($twig, $debug);
        ....
    }
}

CustomExceptionController работает только тогда, когда служба определена как public.Поскольку _defaults настроены на создание private сервисов, это должно быть определено вручную.Поскольку контроллер принадлежит AppBundle, я бы (пока) хотел бы сохранить этот конфиг в связках service.yml

Однако, только применение public: true НЕ работает :

Ошибка типа: слишком мало аргументов для функции AppBundle \ Controller \ CustomExceptionController :: __ construct (), 0 передано в ... / project / var / cache / dev / ContainerW0i3edc / getCustomExceptionControllerService.php в строке11 и ровно 2 ожидаемых

Хотя в сообщении упоминается кэш, это не проблема кеширования (удаление папок и восстановление кеша ничего не меняет).

Только если я добавлю autowire: true к определению конкретной службы, autowire попытается настроить службу.Тем не менее я получаю следующее сообщение:

Невозможно автоматически подключить службу "AppBundle \ Controller \ CustomExceptionController": аргумент "$ debug" метода "__construct ()" не имеет подсказки типа, вам следует настроитьего значение явно.

Так как $debug связан с app/config/services.yml, это не может быть проблемой, не так ли? Однако, это работает, только если я явноустановите аргумент в src/AppBundle/Resources/config/services.yml.

Почему autowire: true не применяется к сервисам, определенным в комплекте services.yml?

Почемупривязка из проекта services.yml не применяется к службам, определенным в комплекте services.yml?

Ожидаемое поведение или что-то не так с моей конфигурацией?

1 Ответ

0 голосов
/ 20 декабря 2018

Почему autowire: true не применяется к сервисам, определенным в пакете services.yml?

Почему привязка из проекта services.yml не применяется к сервисам, определенным в сервисах пакета.yml?

Ожидаемое поведение или что-то не так с моей конфигурацией?

На все ваши вопросы:

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

Как решить вашу проблему?

Добавить раздел _defaults в файл src/AppBundle/Resources/config/services.yml.


Вы можете узнать больше об изменениях DI Symfony 3.3+ в документации или в моем сообщении с до / после примеров .

...