Я пытаюсь использовать тег 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
, он всегда автоматически устанавливает полный контейнер и с этим соответствующее сообщение об устаревании (поскольку я сам его не устанавливаю):
User Deprecated: автоматическое внедрение контейнера для «WM\ApiBundle\Controller\UserController» устарело, начиная с Symfony 4.2. Вместо этого настройте его как службу.
При установке autowire: true
Symfony учитывает тег container.service_subscriber
и устанавливает только частичный контейнер (ServiceLocator), что также устранит сообщение об устаревании. Я ожидал, что автосвязывание не должно иметь никакого значения в этом случае, потому что я явно указываю сервису, какие другие сервисы у него должны быть.
Я неправильно использую теги или у меня есть общая проблема с пониманием того, как подписаться на обслуживание контроллера?
['setContainer', ['@Psr\Container\ContainerInterface']]
, который дал бы мнеServiceLocator
. Однажды я попробовал это сservice_container
, но это всегда будет содержать полный контейнер, так что, вероятно, это меня смутило. 06.02.2020