Symfony手动注入参数:'arguments'与'bind'的实现对比
如果你想在禁用Autowiring的前提下,手动给DefaultController注入构造参数,这两种方式都是可行的,我帮你详细拆解下:
方式一:直接使用arguments配置
这种方式是**针对特定服务(这里就是DefaultController)**精准注入构造参数,适合只给单个服务配置注入的场景:
services: _defaults: autowire: false autoconfigure: true public: true App\Service\SomeService: ~ App\Controller\DefaultController: arguments: $service: '@App\Service\SomeService' $scalar: 22
这里的逻辑很直接:
- 先禁用全局自动装配,开启自动配置并把服务设为公开
- 定义
SomeService作为基础服务 - 给
DefaultController的构造函数参数赋值:$service对应注入SomeService的实例,$scalar传入标量值22
方式二:使用bind全局绑定
bind适合多个服务需要注入相同参数的场景,可以在全局默认配置里统一定义参数绑定,这样所有符合条件的服务都会自动应用这些绑定:
services: _defaults: autowire: false autoconfigure: true public: true bind: $service: '@App\Service\SomeService' $scalar: 22 App\Service\SomeService: ~ App\Controller\DefaultController: ~
和arguments的核心区别在于:
bind是在_defaults下配置,相当于给所有服务设置了“默认参数绑定规则”- 只要某个服务的构造函数里存在
$service或$scalar这样的参数名,就会自动注入对应的值,不用每个服务都单独写arguments配置 - 如果某个服务需要覆盖全局绑定,也可以在该服务的
arguments里单独定义,优先级更高
内容的提问来源于stack exchange,提问作者Alexey Chuhrov
相关产品推荐
相关产品推荐

