在Symfony2中放置自定义初始化代码的位置?

时间:2012-10-22 19:44:37

标签: php symfony dependency-injection

假设我有两项服务:

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

我想做这样的事情:

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

这是一些必须在项目中的所有位置都处于活动状态的初始化代码。据我所知,我有几个选项(这两个服务都来自vendor-dir(我自己没有写过)):

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

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

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

2 个答案:

答案 0 :(得分:3)

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

检查cookboook中的this example

您的听众是一项服务,因此您可以根据需要注入两项服务。

答案 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