我尝试使用method-return-value作为DI参数。 具体的用例是我有一个服务,其逻辑是计算用户 - 国家/地区代码,如:
$user->getCountryCode();
另一方面,我有很多依赖于国家的服务:
$foo = new Foo('UK');
$bar = new Bar('USA');
我知道我可以将用户服务注入Foo / Bar,但这会造成奇怪的依赖,因为这些服务不需要用户只需要国家代码。
我有没有办法按照以下方式编写服务描述:
my_services.foo:
class: Foo
arguments:
- @user.getCountryCode
编辑: 我使用symfony 2.4和yml配置。
答案 0 :(得分:2)
服务定义:
# 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);
}
}
现在,当您在任何服务中注入@FooFactory
时,Symfony实际上会调用FooFactory::create
并将该方法的结果注入其中。
答案 1 :(得分:2)
# services.yml
foo_service:
class: Foo\FooBundle\Service\FooService
arguments: ["=service('user_countrycode_calc_service').calculateCountryCode()"]