gpt4 book ai didi

symfony - 将基于参数的服务注入(inject)其他服务

转载 作者:行者123 更新时间:2023-12-04 16:53:01 27 4
gpt4 key购买 nike

我有一项服务需要司机来完成实际工作。驱动程序本身在 Symfony 2 的上下文中只是另一个服务。

为了说明一个简化的版本:

services:
# The driver services.
my_scope.mailer_driver_smtp:
class: \My\Scope\Service\Driver\SmtpDriver

my_scope.mailer_driver_mock:
class: \My\Scope\Service\Driver\MockDriver

# The actual service.
my_scope.mailer:
class: \My\Scope\Service\Mailer
calls:
- [setDriver, [@my_scope.mailer_driver_smtp]]

如上所示,我可以将两个驱动程序服务中的任何一个注入(inject)到 Mailer 服务中。问题当然是被注入(inject)的驱动服务是硬编码的。所以,我想参数化 @my_scope.mailer_driver_smtp .

我通过在我的 parameters.yml 中添加一个条目来做到这一点。
my_scope_mailer_driver: my_scope.mailer_driver_smtp

然后我可以在我的 config.yml 中使用它并将参数分配给语义公开的配置 [1]:
my_scope:
mailer:
driver: %my_scope_mailer_driver%

最后,在 Configuration我的捆绑包的类我在容器上设置了一个参数:
$container->setParameter('my_scope.mailer.driver', $config['mailer']['driver'] );

容器参数的值 my_scope.mailer.driver现在等于 my_scope.mailer_driver_smtp我在 parameters.yml 中设置的,也就是我的理解是正确的,只是一个字符串。

如果我现在使用容器中的参数名称,我会收到一个错误,提示没有这样的服务。例如:
services:
my_scope.mailer:
class: \My\Scope\Service\Mailer
calls:
- [setDriver, [@my_scope.mailer.driver]]

以上将导致错误:
[Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException]                                          
The service "my_scope.mailer" has a dependency on a non-existent service "my_scope.mailer.driver"

现在的问题是,注入(inject)这个基于容器参数的服务的正确语法是什么?

[1] http://symfony.com/doc/current/cookbook/bundles/extension.html

最佳答案

This question has a similar answer here



我认为使用这种定义的最好方法是使用 service aliasing .
这可能看起来像这样

Acme\FooBundle\DependencyInjection\AcmeFooExtension
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration;
$config = $this->processConfiguration($configuration, $configs);

$loader = new Loader\YamlFileLoader(
$container,
new FileLocator(__DIR__.'/../Resources/config')
);
$loader->load('services.yml');

$alias = $config['mailer']['driver'];
$container->setAlias('my_scope.mailer_driver', $alias);
}

这将为您在 my_scope.mailer.driver 中定义的服务设置别名。与 my_scope.mailer_driver ,您可以将其用作任何其他服务

services.yml
services:
my_scope.mailer_driver:
alias: my_scope.mailer_driver_smtp # Fallback

my_scope.mailer_driver_smtp:
class: My\Scope\Driver\Smtp

my_scope.mailer_driver_mock:
class: My\Scope\Driver\Mock

my_scope.mailer:
class: My\Scope\Mailer
arguments:
- @my_scope.mailer_driver

有了这样的设计,只要你改变 my_scope.mailer_driver,服务就会改变。 config.yml 中的参数。
请注意,如果服务不存在,扩展程序将引发异常。

关于symfony - 将基于参数的服务注入(inject)其他服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22367057/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com