Государственная служба считается частной

У меня есть библиотека, используемая двумя приложениями Symfony, эта библиотека определяет набор сервисов, которые я хочу сделать общедоступными (я хочу иметь возможность получать их напрямую через контейнер. Когда я пытаюсь получить доступ к одному сервису, у меня есть это:

Служба «Library\Service\DerivedServices\OneSpecificImplementation» или псевдоним был удален или встроен при компиляции контейнера. Вы должны либо сделать его общедоступным, либо прекратить использовать контейнер напрямую и вместо этого использовать внедрение зависимостей.

Проблема в том, что указанная служба является общедоступной.

В основном есть:

  • класс Library\Service\BaseService, у которого есть два установщика для общих зависимостей (доктрина и регистратор в этом фрагменте);
  • несколько производных классов (в пространстве имен Library\Service\DerivedServices), каждый из которых определяет новую службу (с собственным конструктором для непосредственной обработки DI).

Итак, вот мои определения услуг:

# Base: inject common dependencies
Library\Service\BaseService:
  abstract: true
  calls:
    - [setDoctrine, ['@doctrine.orm.entity_manager']]
    - [setLogger, ['@Library\Service\Logger']]

# These services are public to be retrieved directly by the container interface
Library\Service\DerivedServices\:
  resource: '../vendor/company/library/src/Library/Service/DerivedServices'
  public: true
  autowire: true
  autoconfigure: false
  parent: Library\Service\BaseService

Затем приложение Symfony извлекает один производный сервис, например:

$this->get('Library\Service\DerivedServices\OneSpecificImplementation');

Это не имело никакого значения:

  • Я изменил порядок определений службы
  • Оба приложения работают под управлением Symfony 4.3.3.

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


person Benoit Duffez    schedule 08.08.2019    source источник
comment
должно быть resource: '../vendor/company/library/src/Library/Service/DerivedServices/*'?   -  person Federkun    schedule 09.08.2019
comment
@Federkun: Да, ты прав, это плохая копия/вставка, извини. В моем коде нет ошибки, так что проблема не в этом.   -  person Benoit Duffez    schedule 09.08.2019


Ответы (1)


Оказывается порядок объявления услуг имеет большое значение. Как я и думал, проблема была в конфигурации.

Я имел:

Library\Service\BaseService:
  ...

Library\Service\DerivedServices\:
  ...

Library\Service\:
  resource: '../vendor/company/library/src/Library/Service'

Последняя инструкция повторно объявила все службы частными (по умолчанию).
Я изменил это на:

Library\Service\:
  resource: '../vendor/company/library/src/Library/Service'

Library\Service\BaseService:
  ...

Library\Service\DerivedServices\:
  ...

Это сначала объявило все службы частными, а затем повторно объявило их с новым объявлением: использование родителя + общедоступного.

person Benoit Duffez    schedule 09.08.2019