2013-07-11 111 views
0

我只是按照http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1的文章,並有一些關於DI容器的問題。DI容器和控制器

比方說,我想在我的控制器中觸發一個事件,我將如何獲得我的控制器內的調度器?

我通過

$c->get('app')->handle($request); 

開始我的測試框架, '應用' 是的Symfony \ HttpKernel。我如何設置依賴到容器?比方說,我有一個觀點引擎,在容器

$c->register('view.engine', 'Core\ViewEngine'); 

定義,我想給該對象,或解決對象,我的控制器內呈現的一些看法。這與事件引發的問題相同,我無法訪問控制器中的這些值...... DI容器如何在這種情況下工作?

謝謝!

回答

-1

有不同的方法。作爲下一步,您可能需要閱讀一下silex文檔。在silex中,應用程序本身是一個DI容器。您也可以閱讀Symfony 2文檔的介紹。

最直接的方法(以及S2用作默認方法)是將DI容器本身注入到控制器中。控制器可以根據需要提取調度員等服務。

「更好」的方法是將調度器連同控制器需要的任何其他內容直接注入控制器。這是「更好的」,因爲控制器本身不需要訪問容器。但是由於控制人員通常只需要一些服務就可以了,因此更加困難。

==============================================

我該如何將容器注入控制器?

這就是查看現有框架開始派上用場的地方。請記住,HTTPKernel是一個組件,而不是一個框架。你如何使用它取決於你。

在Symfony 2中,應用程序對象實際上是從內核而不是HTTPKernel派生的。內核反過來包含HTTPKernel的一個實例以及容器的一個實例。

您可能需要採取幾種方法。沒有一個「正確」的。

如果你看看HTTPKernel :: handleRaw你會發現:

$controller = $this->resolver->getController($request)) 

你可以使自己的控制器解析器對象,它會創建控制器後,注入容器。只有一種可能性。

+0

我該如何將容器注入控制器?由於HttpKernel正在創建我的控制器,所以我無法通過構造函數給出它,並且我無法控制該控制器,因爲我得到的所有回報都是響應對象 – user2538584

+0

在事實發生兩年後以倒票投票。如此勇敢。 – Cerad