【问题标题】:Symfony Service has multiple instancesSymfony 服务有多个实例
【发布时间】:2014-08-06 00:25:10
【问题描述】:

为什么每次请求后都会调用我的服务的构造函数?我只希望它在我的应用程序的生命周期内执行一次。

我希望我的服务的构造函数在我的应用程序的生命周期内只运行一次,因为the documentation 指出:

$mailer = $this->get('my_mailer');

作为额外的好处,Mailer 服务只创建一次,并且 每次请求服务时都会返回相同的实例。这是 几乎总是你需要的行为(它更灵活, 强大),但我们稍后将了解如何配置服务 有多个实例。

但是,当我调用该服务时,我得到了一个新实例。每个请求都会发生这种情况。

可能的类似帖子

【问题讨论】:

  • 您的邮件程序是否在scope: request 中定义?如果是这样,它将为每个请求(主请求和子请求)创建。因此,如果您在 request 范围内定义了服务,并且您在视图中的某处有 {{ render(controller('...')) }},它实际上将被实例化两次(假设在两个请求处理中都需要它进程)。
  • @Igor 不。我认为问题在于我有 Java 背景。我希望类在请求之间存在于内存中。

标签: php symfony


【解决方案1】:

这意味着它是从请求到响应的同一个实例。如果您在该生命周期内调用它,它将返回相同的值。如果你在另一个 Request 中调用它,它会给你一个新对象。

这就是 PHP 的工作方式,在执行结束时,所有内容都从内存中释放,所有数据和对象都被销毁。

【讨论】:

    【解决方案2】:

    作为额外的好处,Mailer 服务只创建一次,并且 每次请求服务时都会返回相同的实例。

    这并不意味着您的服务将被一劳永逸地实例化,直到时间结束:)

    这意味着您的服务在脚本执行期间将是一个单例。基本上,在您的页面/命令执行期间。

    如果您在控制器的操作中调用了服务 4 次,并且没有在服务定义中设置选项 scope="prototype",那么它将仅作为单例实例化一次。

    但是如果您更改页面并在控制器中执行不同的操作,该操作也会调用您的服务。 Php 启动一个新进程,因此您的服务将作为一个新对象实例化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      相关资源
      最近更新 更多