是否可以在symfony services.yml中将方法注入服务

时间:2016-02-27 23:02:40

标签: php symfony dependency-injection

互联网上已有大量关于将服务注入其他服务的文档:http://symfony.com/doc/current/components/dependency_injection/introduction.html

但是,我已经有一个名为ObjectCache的服务,它在symfony的services.yml中配置如下:

object_cache:
  class: App\Bundle\ApiBundle\Service\ObjectCache

此服务目前有两种获取和设置User对象的方法。例如:

$user = new User(); // assume entity from database
$this->get('object_cache')->setUser($user);
// ...
$this->get('object_cache')->getUser(); // instance of $user

我想创建一个始终依赖于用户的新服务,因此在创建服务时注入用户是有意义的:

class SomeService {
    public function __construct(User $user)
    {
    }
}

我如何配置services.yml以便将User注入我的新服务?

object_cache:
  class: App\Bundle\ApiBundle\Service\ObjectCache
some_service:
  class: App\Bundle\ApiBundle\Service\SomeService
  arguments: [@object_cache->getUser()????]

这没有用,至少可以说symfony yaml文档是粗略的。

我基本上不得不创建一个UserCache的User-only风格并将其注入SomeService或期望SomeService接收ObjectCache并在构造函数中调用getUser一次?

1 个答案:

答案 0 :(得分:1)

归功于qooplmao,感谢他们帮助我找到this is exactly what I was looking for的答案。我认为我会为了其他人的利益回答我自己的问题,因为我现在有了这个工作,还加上对评论中语法的一些更正。

我应该一直在寻找的是Symfony的表达语言,它允许我正在寻找的控制粒度。

结果配置现在如下所示:

object_cache:
  class: App\Bundle\ApiBundle\Service\ObjectCache
some_service:
  class: App\Bundle\ApiBundle\Service\SomeService
  arguments: [@=service('object_cache').getUser()]

有关表达式语法的更多信息,请参阅以下详细文档:http://symfony.com/doc/2.7/components/expression_language/syntax.html

(如果只有Symfony文档有礼貌的话,可以在引用它的页面上提供这些重要信息的链接!)