通过“ container.service_subscriber”向控制器添加服务无法正常工作

问题描述 投票:-2回答:1

我正在尝试使用控制器上的container.service_subscriber标记使某些服务可用,而无需通过构造函数注入它们。在我们的项目中,我们不想使用autowiring,也不能使用自动配置选项。

控制器的结构如下:

我有一个基BaseController,它是从FOSRestBundle的AbstractFOSRestController扩展而来的,该库对我的所有Controller具有一些常用的方法。该服务将用作我其他控制器的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,它总是自动设置完整的容器,并随之设置适当的弃用消息(因为我自己没有设置它:]]

不推荐使用的用户:自Symfony 4.2起,不建议为“ WM \ ApiBundle \ Controller \ UserController”自动注入容器。而是将其配置为服务。

[设置autowire: true时,Symfony确实尊重container.service_subscriber标签,仅设置了部分容器(ServiceLocator),这也将解决弃用消息。我本来希望在这种情况下自动装配不会有任何区别,因为我明确地告诉服务它应该具有哪些其他服务。我是否使用了错误的标签,或者在理解如何向Controller订阅服务方面遇到一般性问题?

我正在尝试使用Controller上的container.service_subscriber标记使某些服务可用,而不通过构造函数注入它们。在我们的项目中,我们不想使用...

php symfony fosrestbundle
1个回答
1
投票

基本问题是内置的服务订阅者功能只会将服务定位符注入到构造函数中。扩展AbstractController的常规控制器使用autoconfigure基本上覆盖了它,并使用setContainer而不是构造函数。

© www.soinside.com 2019 - 2024. All rights reserved.