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

标签 symfony

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

相关文章:

symfony - Sonata 管理过滤器中的日期范围选择器

Symfony 2 在共享主机上?

mysql - 如何对分组进行子计数

mysql - 当我添加分页排序时,Symfony 创建了错误的 SQL

mysql - Doctrine 迁移中的错误

php - Doctrine 获取所有具有关联的字段名称

unit-testing - 测试中的 Symfony2 实体管理器

php - Twig 过滤器/扩展中的 Symfony2 : How to get container parameters from parameters. yml?

forms - 带有 "allow_add"的 Symfony CollectionType 未将子实体添加到父实体

caching - 使用 symfony2 清除缓存命令不刷新静态 Assets