Я пытаюсь использовать тег container.service_subscriber
на моем контроллере, чтобы сделать некоторые службы доступными без внедрения их через конструктор. В нашем проекте мы не хотим использовать autowiring
, а также не можем использовать параметр автоконфигурирования.
Структура контроллера выглядит следующим образом:
У меня есть база BaseController
, который происходит от AbstractFOSRestController
FOSRestBundle, который имеет некоторые общие используемые методы для всех моих контроллеров. Этот сервис будет использоваться как parent
для других моих контроллеров.
Определение сервиса выглядит следующим образом:
WM\ApiBundle\Controller\BaseController:
class: WM\ApiBundle\Controller\BaseController
abstract: true
arguments:
- "@service1"
- "@service2"
- ...
WM\ApiBundle\Controller\UserController:
parent: WM\ApiBundle\Controller\BaseController
public: true
#autowire: true
class: WM\ApiBundle\Controller\UserController
tags:
- { name: 'container.service_subscriber'}
- { name: 'container.service_subscriber', key: 'servicexyz', id: 'servicexyz' }
Класс выглядит следующим образом:
/**
* User controller.
*/
class UserController extends AbstractCRUDController implements ClassResourceInterface
{
public static function getSubscribedServices()
{
return array_merge(parent::getSubscribedServices(), [
'servicexyz' => ServiceXYZ::class,
]);
}
.......
}
У меня проблема в том, что, если я установлю autowire: false
, он всегда автоматически устанавливает полный контейнер и вместе с этим соответствующее сообщение об устаревании (поскольку я не устанавливаю его сам):
Пользователь не поддерживает: Авто-инъекция контейнера для «WM \ ApiBundle \ Controller \ UserController» устарела с Symfony 4.2. Вместо этого настройте его как службу.
При установке autowire: true
Symfony учитывает тег container.service_subscriber
и устанавливает только частичный контейнер (ServiceLocator), который также будет разрешать сообщение об устаревании. Я ожидал бы, что автоматическая разводка не должна иметь никаких различий в этом случае, потому что я явно говорю службе, какие другие службы она должна иметь.
Я неправильно использую теги или у меня есть общая проблема в понимании того, как подписаться на служба контроллеру?