Symfony autowire-不同的service.yml文件之间是什么关系?

时间:2018-12-20 08:47:41

标签: symfony autowired

我正在将现有的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   通过   ... /项目/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 :(得分:1)

  

为什么autowire:true不应用于捆绑包services.yml中定义的服务?

     

为什么来自项目services.yml的绑定未应用于捆绑包services.yml中定义的服务?

     

是预期的行为,还是我的配置有问题?

对于您的所有问题:

_defaults仅适用于本地定义的服务,不适用于导入的服务。 这是因为这样的全局应用程序可能会破坏外部配置。

如何解决您的问题?

_defaults部分添加到src/AppBundle/Resources/config/services.yml文件中。


您可以在in documentation或在我的post with before/after examples中阅读有关Symfony 3.3+ DI更改的更多信息。