Symfony 手动连接参数 - 'arguments' vs 'bind'
Symfony manually wiring arguments - 'arguments' vs 'bind'
我试图弄清楚如何手动将参数注入 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
有什么区别,它们做的事情完全一样吗?
bind
通常在 _defaults
部分中用于替换该文件定义的服务中任何匹配的参数名称。
因此,从第二个示例中获取变量名称,并将它们放入更常见的 _defaults:
节
_defaults:
# autowire / autoconfig, etc
bind: #!
$service: '@App\Service\SomeService'
$scalar: 22
任何具有这些变量名称的服务都将被服务或标量值 (22) 替换(除非在本地覆盖)。
bind
用于更全局的方法,正如 Alister Bulman 所解释的那样。但是当用于 class 定义时,bind
和 arguments
或多或少是相同的。
我看到的唯一区别是 arguments
更灵活并且接受数组:
App\Controller\DefaultController:
arguments:
- '@App\Service\SomeService'
- 22
arguments
也优先于 bind
.
我猜文档不一致,因为 bind
相对较新。
还有一点要补充 - 绑定用于 "bind arguments by name or type" 并且也可以在一次加载多个服务时使用 - https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type .
编辑:您也可以在多个服务定义中使用参数,但它 "force injects" 所有实例化服务的参数,即。所有参数都必须在所有服务中接受,而绑定按需注入。
我试图弄清楚如何手动将参数注入 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
有什么区别,它们做的事情完全一样吗?
bind
通常在 _defaults
部分中用于替换该文件定义的服务中任何匹配的参数名称。
因此,从第二个示例中获取变量名称,并将它们放入更常见的 _defaults:
节
_defaults:
# autowire / autoconfig, etc
bind: #!
$service: '@App\Service\SomeService'
$scalar: 22
任何具有这些变量名称的服务都将被服务或标量值 (22) 替换(除非在本地覆盖)。
bind
用于更全局的方法,正如 Alister Bulman 所解释的那样。但是当用于 class 定义时,bind
和 arguments
或多或少是相同的。
我看到的唯一区别是 arguments
更灵活并且接受数组:
App\Controller\DefaultController:
arguments:
- '@App\Service\SomeService'
- 22
arguments
也优先于 bind
.
我猜文档不一致,因为 bind
相对较新。
还有一点要补充 - 绑定用于 "bind arguments by name or type" 并且也可以在一次加载多个服务时使用 - https://symfony.com/doc/current/service_container.html#binding-arguments-by-name-or-type .
编辑:您也可以在多个服务定义中使用参数,但它 "force injects" 所有实例化服务的参数,即。所有参数都必须在所有服务中接受,而绑定按需注入。