Symfony Dependency Injection组件Autowire自动装配失效问题求助
解决Symfony Dependency Injection 3.4在PHP5.6下Autowire失效的问题
咱们先明确:Symfony 3.4的Autowire功能本身就有不少版本相关的限制,再加上PHP5.6的特性约束,得一步步排查问题根源:
1. 先确认全局Autowire是否开启
Symfony 3.4默认是不全局启用Autowire的,你得在services.yaml的根级别配置全局默认规则,而且要放在所有服务定义的前面:
services: # 全局配置自动装配、自动配置的默认规则 _defaults: autowire: true autoconfigure: true public: false # 你的服务定义放在下面 logger: class: Monolog\Logger arguments: ["application"] public: true Monolog\Logger: '@logger' plugin_context: class: MyProject\PluginContext public: true
如果没加_defaults这部分,单个服务的autowire: true配置可能不会生效,因为3.4的Autowire依赖全局默认配置的触发。
2. 检查类构造函数的依赖类型提示
PHP5.6不支持标量类型提示(比如string、int这类基础类型),而Symfony 3.4的Autowire只能识别有明确类/接口类型提示的构造函数参数。
举个例子,如果你的PluginContext构造函数是这样的:
class PluginContext { // 这里$logger有明确的类类型提示,Autowire能识别;但$appName没有,就会失败 public function __construct(Monolog\Logger $logger, $appName) { // ... } }
这种情况下,你必须手动给无类型提示的参数指定值:
plugin_context: class: MyProject\PluginContext arguments: $appName: "my_project" public: true
3. 确认依赖的类型与服务别名匹配
你给Monolog\Logger设置了别名指向logger服务,这点没问题,但要确保PluginContext的构造函数里依赖的是**Monolog\Logger类类型**,而不是无类型提示的服务ID:
// 正确写法:有明确的类类型提示,Autowire能匹配到对应的服务 public function __construct(Monolog\Logger $logger) { $this->logger = $logger; } // 错误写法:没有类型提示,Autowire无法识别这是要注入logger服务 public function __construct($logger) { $this->logger = $logger; }
4. 清理缓存并验证容器配置
Symfony 3.4在开发环境会缓存容器配置,先手动清理缓存:
- CLI环境执行:
php bin/console cache:clear --env=dev - Web环境直接删除
var/cache/dev目录
之后可以用命令查看服务的注入详情,确认Autowire是否生效:
php bin/console debug:container plugin_context
在输出里找Autowired相关的条目,看看依赖是否被正确识别。
5. 确保Symfony DI版本是3.4的最新稳定版
你用的是^3.4,早期的3.4版本可能存在Autowire的bug,先检查当前版本:
composer show symfony/dependency-injection
如果不是3.4.x的最新版,执行更新:
composer update symfony/dependency-injection --with-all-dependencies
内容的提问来源于stack exchange,提问作者Nisar Ahmed
相关产品推荐
相关产品推荐

