我已经了解了symfony服务文档,并且在创建服务时默认情况下,它将在容器范围内创建,并且将仅构造一次(如果请求至少一次)。
我在服务构造函数中添加了一些日志,并注意到构造函数被多次调用:我正在刷新我的控制器中调用操作的网页。此操作获取我的服务并使用它。 每次刷新我的网页时,都会调用并记录服务构造函数。 我正在使用Symfony 2.1 这是正常的吗?我错过了什么?
提前感谢您的反馈
答案 0 :(得分:1)
是的,PHP完全正常,因为PHP是interpreted编程语言。因此,每次您请求(例如刷新页面时)服务器时,PHP代码都会由具有PHP处理器模块的Web服务器解释。
的更多信息答案 1 :(得分:1)
服务是单身,因此始终只能存在一个实例。
答案 2 :(得分:1)
我知道这是一个古老的问题,但是对于愿意了解正在发生的事情的人,我还有一些补充意见。
是的,服务仅实例化一次。但是会根据请求实例化它们。您应该注意的最重要的事情是谁发起了请求。我们大多数人已经安装的捆绑包(我认为是)是FosJsRoutingBundle捆绑包。
它确实神奇,但是它必须回调服务器以从其自己的ExposedRoutesExtractor
获取公开的路由。这样便可以多次初始化您的服务
在服务的构造函数中放置一个断点,并在每次命中断点时查看$_SERVER["REQUEST_URI"]
变量。您会注意到类似这样的内容:
<your_own_uri>
<-您的初始请求/js/routing?callback=fos.Router.setData
<-FosJsRoutingBundle /_wdt/c7becf
<-WebProfilerBundle 我希望这会有所帮助:)
答案 3 :(得分:0)
您可能在代码中调用了两次(或更多)服务。但作为一般规则并根据最新的Symfony docs(3.1):
当您从容器中请求
app.mailer
服务时,容器会构造对象并将其返回。这是使用服务容器的另一个主要优点。也就是说,在需要之前永远不会构建服务。如果您定义服务并且从不在请求中使用它,则永远不会创建服务。