我试图找出如何手动将参数注入DefaultController
(无需自动装配)。
我发现有两种方法可以实现这一目标。
我可以使用arguments
:
services:
_defaults:
autowire: false
autoconfigure: true
public: true
App\Service\SomeService: ~
App\Controller\DefaultController:
arguments: #!
$service: '@App\Service\SomeService'
$scalar: 22
与此同时,我可以使用bind
密钥:
services:
_defaults:
autowire: false
autoconfigure: true
public: true
App\Service\SomeService: ~
App\Controller\DefaultController:
bind: #!
$service: '@App\Service\SomeService'
$scalar: 22
我的控制器:
class DefaultController extends Controller
{
public function __construct($service, $scalar)
{
var_dump(get_class($service), $scalar);
}
...
两个选项都产生相同的输出:
string(23)" App \ Service \ SomeService" INT(22)
那么这两个配置键arguments
和bind
之间有什么区别,它们是否完全相同?
答案 0 :(得分:2)
bind
通常用于_defaults
部分,以替换该文件定义的服务中的任何匹配参数名称。
因此,从第二个示例中获取变量名称,并将它们放入更常见的_defaults:
节
_defaults:
# autowire / autoconfig, etc
bind: #!
$service: '@App\Service\SomeService'
$scalar: 22
具有这些变量名称的任何服务都将被替换(除非在本地覆盖)服务或标量值(22)。
答案 1 :(得分:1)
bind
用于更全面的方法。但是,当在类定义上使用时,bind
和arguments
或多或少相同。
我看到的唯一区别是arguments
更灵活并接受数组:
App\Controller\DefaultController:
arguments:
- '@App\Service\SomeService'
- 22
arguments
也优先于bind
。
我认为文档不一致,因为bind
相对较新。
答案 2 :(得分:1)
要添加的另一件事-绑定用于“按名称或类型绑定参数”,也可以在一次加载多个服务时使用-https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type。
edit:您也可以在多个服务定义中使用参数,但是它将这些参数“强制注入”到所有实例化的服务中。所有参数都必须在所有服务中接受,而bind则按需注入。