我试图弄清楚如何手动将参数注入 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
之间有什么区别,它们是否完全相同?
2 回答
bind
通常用于_defaults
部分,以替换该文件定义的服务中的任何匹配参数名称 .因此,从第二个示例中获取变量名称,并将它们放入更常见的
_defaults:
节中具有这些变量名称的任何服务都将被替换(除非在本地覆盖)服务或标量值(22) .
如Alister Bulman所解释的,
bind
用于更全面的方法 . 但是当在类定义上使用时,bind
和arguments
或多或少相同 .我看到的唯一区别是
arguments
更灵活并接受一个数组:arguments
也优先于bind
.我想文档是不一致的,因为
bind
是相对较新的 .