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]
4

2 回答 2

4

官方文档明确告知不要将整个 DIC 注入控制器(感谢@NHG 提供链接)。

部分如何使用范围

将整个容器注入服务通常不是一个好主意(只注入你需要的东西)。

但在服务容器部分:

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

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

于 2013-10-29T14:25:16.167 回答
0

使用控制器作为服务的想法是只注入必要的服务。标准控制器扩展Symfony\Bundle\FrameworkBundle\Controller\Controller了哪些扩展Symfony\Component\DependencyInjection\ContainerAware。所以,注入整个容器是没有意义的......

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

于 2013-10-29T11:58:25.223 回答