0

假设我有两个服务:

get('my_first_service')
get('my_second_service')

我想做这样的事情:

$this->get('my_first_service')->doSomething($this->get('my_second_service'));

这是一些必须在项目中任何地方都处于活动状态的初始化代码。据我所知,我有几个选择(这两种服务都来自供应商目录(我自己没有写过它们)):

  1. 在 app.php 和/或 app_dev.php 中添加上面的代码(有一些修改)
  2. 将上述代码添加到每个控制器操作
  3. 以服务作为参数创建一个服务,并在构造函数中添加上述代码

第一个选项似乎有点“不寻常”,因为我没有链接编辑 app.php 文件以获取链接。第二个选项效率太低,因为我需要为数十个操作执行此操作。第三个动作似乎更好,但我仍然需要从某个地方调用此服务才能执行构造函数,对吗?

我觉得我错过了一种可能性......这种初始化代码一定有更好的地方吗?

4

2 回答 2

3

如果你真的想在每一个动作之前执行你的代码,你可以监听事件 kernel.controller。

检查食谱中的这个例子

您的侦听器是一项服务,因此您可以在需要时注入您的两个服务。

于 2012-10-22T22:40:54.620 回答
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 返回一个您需要使用的不同对象,那么它听起来像一个工厂,您也可以对其进行配置。通读

于 2012-10-22T19:51:26.053 回答