gpt4 book ai didi

symfony - 方法返回值作为服务参数

转载 作者:行者123 更新时间:2023-12-04 08:49:16 29 4
gpt4 key购买 nike

我正在尝试使用方法返回值作为 DI 参数。具体用例是我有一个服务具有计算用户国家代码的逻辑,例如:

$user->getCountryCode();

另一方面,我有许多服务取决于国家/地区,例如:

$foo = new Foo('UK');
$bar = new Bar('USA');

我知道我可以将用户服务注入(inject) Foo/Bar,但这会产生奇怪的依赖性,因为这些服务不需要用户,它们只需要国家代码。

有没有办法让我按照以下方式编写服务描述:

  my_services.foo:
class: Foo
arguments:
- @user.getCountryCode

编辑:我正在使用带有 yml 配置的 symfony 2.4。

最佳答案

服务工厂方法(兼容所有Symfony2版本)

服务定义:

# services.yml

FooFactory:
class: Foo\FooBundle\Service\FooFactory
arguments: [@user_country_code_calc_service]

FooService:
class: Foo\FooBundle\Service\FooService
factory_service: FooFactory
factory_method: create

还有你的工厂:

// FooFactory.php

class FooFactory
{
private $countryCodeCalculator;

public function __construct(UserCountryCodeCalculator $countryCodeCalculator)
{
$this->countryCodeCalculator = $countryCodeCalculator;
}

public function create()
{
$countryCode = $this->countryCodeCalculator->calculate(...);

return new FooService($countryCode);
}
}

现在,当您在任何服务中注入(inject) @FooFactory 时,Symfony 实际上会调用 FooFactory::create 并将该方法的结果注入(inject)其中。

关于symfony - 方法返回值作为服务参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24425712/

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