【问题标题】:Where to put custom initialization code in Symfony2?Symfony2 自定义初始化代码在哪里?
【发布时间】:2012-10-22 19:44:37
【问题描述】:

假设我有两个服务:

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 文件以获得链接。第二个选项效率太低,因为我需要为数十个操作执行此操作。第三个动作似乎更好,但我仍然需要从某个地方调用此服务才能执行构造函数吗?

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

【问题讨论】:

  • 如果my_first_service 依赖于my_second_service,那么您应该通过DIC 提供的任何必要注入方法将第一个服务配置为注入第二个服务。
  • 如果问题是为每个请求自动创建实例,请将其标记为listener

标签: php symfony dependency-injection


【解决方案1】:

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

在食谱中查看this example

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

【讨论】:

    【解决方案2】:

    这看起来与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

    【讨论】:

    • 感谢您的回复。这些服务已经定义,因为它们是通过 composer 安装的两个 3rd 方库的一部分。上面的代码定义了新服务,但我真正想要的只是在现有服务中注入 setter。我也可以通过 services.yml 做到这一点吗?
    • 是的,在这种情况下,上面的答案看起来更好
    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2015-06-27
    相关资源
    最近更新 更多