我正在将现有的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
中定义的服务?
是预期的行为还是我的配置有问题?
答案 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更改的更多信息。