我正在尝试使用方法返回值作为 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/