2013-10-29 100 views
2

我正在重構我的控制器之一,使其成爲服務,我想知道是否有性能影響不注入整個服務容器到我的控制器。Symfony2依賴注入:性能影響

是,這是更有效的:

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] 

回答

3

官方文檔明確告訴不要將整個DIC注入控制器(感謝@NHG的鏈接)。

How to work with scopes

注入整個容器到服務通常不是一個好主意 (只注入你的需要)。

但在部分Service container

當你問從容器中my_mailer的服務, 容器構造對象並返回它。這是使用服務容器的另一個主要優勢。也就是說,一項服務永遠不會構造,直到需要時纔會構建。如果你定義了一個服務,並且從不使用 這個服務,那麼這個服務永遠不會被創建。這可以節省內存,並提高應用程序的速度。這也意味着在定義大量服務時性能幾乎沒有影響。 永遠不會使用的服務永遠不會構建。

因此,將整個DIC注入控制器不會對性能造成影響,因爲只有控制器中使用的服務會被實例化。

0

使用控制器作爲服務的想法是隻注入必要的服務。標準控制器延伸Symfony\Bundle\FrameworkBundle\Controller\Controller,其中延伸Symfony\Component\DependencyInjection\ContainerAware。所以,注入整個容器是沒有意義的...

通常,注入少量服務比注入整個容器更有效率。 此外,你應該熟悉base Symfony2 Controller class

+0

只注入必要的服務並不是唯一的優點:我想使用服務很容易地能夠替換控制器(如果需要的話),通過替換定義配置中的控制器類的參數。我無法弄清楚只注入所需的服務會更有效率,因爲我似乎已經閱讀(也許我錯了)服務使用'Singleton模式',並且只在您第一次需要它時立即執行。所以不需要服務不加載。你爲什麼要談論'Controller'類?它與此無關,僅在symfony中爲新手時纔有意思。 – Elorfin

+1

我正在寫'Controller'類,因爲我想告訴你標準Controller和控制器定義爲服務的區別是什麼 - 簡單的PHP類。主要區別在於擴展'ContainerAware'(提供對DIC的訪問)。當然你有權利 - 當你將Controller定義爲服務時,你可以簡單地更改控制器類。關於'單身模式'你錯了。有2個作用域:用於服務的'container','prototype'(和額外的'request')。請看:http://symfony.com/doc/current/cookbook/service_container/scopes。html – NHG

+0

我已經從您的鏈接和其他文檔部分找到的信息做出答案。看起來,即使不推薦整個DIC的注入,性能也沒有實際差異。除非我不知道Instanciate請求的服務,否則'ServiceContainer'中有後臺進程。 – Elorfin