假设我有两项服务:
get('my_first_service')
get('my_second_service')
我想做这样的事情:
$this->get('my_first_service')->doSomething($this->get('my_second_service'));
这是一些必须在项目中的所有位置都处于活动状态的初始化代码。据我所知,我有几个选项(这两个服务都来自vendor-dir(我自己没有写过)):
第一个选项似乎有点“不寻常”,因为我没有链接编辑app.php文件以获取链接。第二种选择效率太低,因为我需要对许多操作执行此操作。第三个动作似乎更好但我仍然需要从某个地方调用此服务才能执行构造函数吗?
我觉得我错过了一种可能性...这种初始化代码必须有一个更好的地方吗?
答案 0 :(得分:3)
答案 1 :(得分:1)
这与setter injection非常相似。您可以将doSomething作为调用添加,my_second_service作为参数。这样,当你获得first_service时,将自动调用该方法,并传入正确的参数,并使您免于丑陋的黑客攻击。
我假设您已经在配置中定义服务。
例如在YAML:
services:
my_second_service:
# ...
my_first_service:
class: MyFirstServiceClassName
calls:
- [ doSomething, [ @my_second_service ] ]
如果doSomething返回您需要使用的其他对象,那么它听起来像工厂,您也可以配置它。仔细阅读this。