symfony服务构造函数多次调用

时间:2014-04-17 08:04:57

标签: php symfony service constructor scope

我已经了解了symfony服务文档,并且在创建服务时默认情况下,它将在容器范围内创建,并且将仅构造一次(如果请求至少一次)。

我在服务构造函数中添加了一些日志,并注意到构造函数被多次调用:我正在刷新我的控制器中调用操作的网页。此操作获取我的服务并使用它。 每次刷新我的网页时,都会调用并记录服务构造函数。 我正在使用Symfony 2.1 这是正常的吗?我错过了什么?

提前感谢您的反馈

4 个答案:

答案 0 :(得分:1)

是的,PHP完全正常,因为PHP是interpreted编程语言。因此,每次您请求(例如刷新页面时)服务器时,PHP代码都会由具有PHP处理器模块的Web服务器解释。

您应该阅读有关Symfony2 and HTTP Fundamentals

的更多信息

答案 1 :(得分:1)

服务是单身,因此始终只能存在一个实例。

答案 2 :(得分:1)

我知道这是一个古老的问题,但是对于愿意了解正在发生的事情的人,我还有一些补充意见。

是的,服务仅实例化一次。但是会根据请求实例化它们。您应该注意的最重要的事情是谁发起了请求。我们大多数人已经安装的捆绑包(我认为是)是FosJsRoutingBundle捆绑包。

它确实神奇,但是它必须回调服务器以从其自己的ExposedRoutesExtractor获取公开的路由。这样便可以多次初始化您的服务

在服务的构造函数中放置一个断点,并在每次命中断点时查看$_SERVER["REQUEST_URI"]变量。您会注意到类似这样的内容:

  1. <your_own_uri> <-您的初始请求
  2. /js/routing?callback=fos.Router.setData <-FosJsRoutingBundle
  3. /_wdt/c7becf <-WebProfilerBundle

我希望这会有所帮助:)

答案 3 :(得分:0)

您可能在代码中调用了两次(或更多)服务。但作为一般规则并根据最新的Symfony docs(3.1):

  

当您从容器中请求app.mailer服务时,容器会构造对象并将其返回。这是使用服务容器的另一个主要优点。也就是说,在需要之前永远不会构建服务。如果您定义服务并且从不在请求中使用它,则永远不会创建服务