方法返回值作为服务参数

时间:2014-06-26 08:23:56

标签: symfony

我尝试使用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配置。

2 个答案:

答案 0 :(得分:2)

服务工厂方法(与所有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);
    }
}

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

答案 1 :(得分:2)

表达式语言方法(与Symfony版本兼容> = 2.4)

# services.yml

foo_service:
  class: Foo\FooBundle\Service\FooService
  arguments: ["=service('user_countrycode_calc_service').calculateCountryCode()"]