Symfony2依赖注入:性能影响

3

我正在重构我的控制器,将其转化为服务,想知道不将整个服务容器注入到我的控制器中是否会有性能影响。

这种方式是否更有效:

innova.path.controller:
    class: %innova.controller.path.class%
    arguments:
       entityManager:   @doctrine.orm.entity_manager
       session:         @session
       securityContext: @security.context
       router:          @router
       translator:      @translator
       pathManager:     @innova.manager.path_manager
    calls:
       - [setRequest, ["@?request="]]
    scope: request

比如说,比这更好的例子?
innova.path.controller:
    class: %innova.controller.path.class%
    arguments: [@service_container]
2个回答

4
官方文档明确告知不要将整个DIC注入到控制器中(感谢@NHG提供的链接)。关于如何使用作用域的部分,请参阅《如何使用作用域》

通常不建议把整个容器注入到服务中(只注入你需要的)。

但是在《服务容器》一节中:

当您从容器请求my_mailer服务时,容器会构造对象并返回它。这是使用服务容器的另一个主要优点。也就是说,在需要之前永远不会构造服务。如果您定义了一个服务却在请求中从未使用过它,则该服务将永远不会被创建。这样可以节省内存并提高应用程序的速度。这也意味着定义大量服务几乎没有性能影响。从未使用过的服务永远不会被构造。

因此,将整个DIC注入到控制器中不会对性能产生影响,因为仅实例化控制器中使用的服务。

0

将控制器用作服务的想法是仅注入必要的服务。标准控制器扩展了Symfony\Bundle\FrameworkBundle\Controller\Controller,该控制器又扩展了Symfony\Component\DependencyInjection\ContainerAware。因此,注入整个容器是没有意义的...

通常,注入较少的服务比注入整个容器更有效率。 此外,您应该熟悉基本Symfony2控制器类


仅注入必要的服务并不是唯一的优势:我想使用服务来轻松地替换控制器,如果需要,只需在配置中更改定义控制器类的参数即可。我无法想象仅注入所需服务如何更有效,因为我似乎已经阅读过(也许我错了)服务使用“单例模式”,并且只有在第一次需要时才会实例化。因此,不需要的服务不会被加载。你为什么要谈论“控制器”类?这与此无关,只有当你是Symfony的新手时才有趣。 - Elorfin
1
我写了关于Controller类的内容,因为我想向您展示标准控制器和定义为服务的控制器(简单的PHP类)之间的区别。主要区别是扩展ContainerAware(提供对DIC的访问)。当然,您是正确的 - 当您将控制器定义为服务时,可以轻松更改控制器类。关于Singleton模式,您是错误的。有两个范围:容器原型(以及额外的请求)用于服务。请参阅:http://symfony.com/doc/current/cookbook/service_container/scopes.html - NHG
我已经根据您提供的链接和另一个文档部分提供了答案。看起来,即使不建议注入整个DIC,性能也没有真正的差异。除非在ServiceContainer中有其他背景进程,而不仅仅是实例化请求的服务,这一点我不清楚。 - Elorfin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接