2015-10-11 24 views
0

我創建了一個可以管理多個網站的應用程序。如果網站有使用權限,可以在網站上使用很多「擴展」(捆綁)。權限(該網站可以使用極好的捆綁包)在我的應用程序中進行管理,並保存在數據庫中(使用允許的捆綁包的名稱空間)。Symfony2在AppKernel中使用getDoctrine()來動態註冊包

編輯: 當我打電話給一個網站時,捆綁包被加載到WebsiteKernel(一個普通的AppKernel,每個網站通常使用)。 每個網站都有自己的應用和網絡文件夾。所以每個網站都有一個單獨的應用程序緩存。每個網站都有它自己的WebsiteKernel.php(=一個普通的AppKernel)。

現在,我要註冊爲當前網站名爲允許束在動態的 WebsiteKernel。在帖子「Is it possible to dynamically register bundles in Symfony2?」中,這是通過查看捆綁目錄完成的。我想以同樣的方式執行此操作,但我只想將保存爲「允許使用本網站」的軟件包包含在數據庫中。

爲此,我需要訪問存儲庫以獲取允許的包名稱空間。我以爲我可以做類似$this->getDoctrine()->getRepository('MyAppBundle:MyObject');但我不知道如何在WebsiteKernel(= AppKernel)中調用這個函數。當我嘗試撥打$this->getDoctrine()時,我有一個UndefinedMethodExeption。當然,我試圖在註冊了教義束之後這樣做。

所以問題是:我該如何更改WebsiteKernel(= AppKernel)中的代碼才能使用$this->getDoctrine()

btw .:這兩個帖子有類似的問題,但他們還沒有得到答覆。

+1

由於服務容器尚未初始化,您無法在registerBundles中獲得任何服務 – viktor77

回答

1

注:此問題已徹底改變所以這個答案已經不再重要。我應該刪除它,但它確實解釋了動態加載包的問題。

問題沒有得到解答的原因是,你基本上不能做你想做的事。

首先,當AppKernel :: registerBundles被調用時,還沒有定義doctrine實體管理器。這是一個雞和蛋的東西。註冊Bundle,處理和合並所有配置文件,然後創建並緩存依賴注入服務定義(包括實體管理器)。

隨着對引導過程的更好理解,您可以創建自己的數據庫連接並從數據庫中提取包類名稱。當然,路由選擇的東西還沒有完成,所以根據路由來確定要加載哪些集羣將意味着進一步的黑客攻擊。

最後一個主要問題是所有的配置信息都被緩存了。看看應用程序/緩存。重建緩存是一個耗時的過程。在每個請求上重建緩存會使您的生產系統陷入癱瘓。如果另一個請求在第一個請求處理的時候進入,那麼你真的被搞砸了,因爲第二個請求可能會在重建緩存時崩潰。

我知道的唯一方法是爲每個網站設置一個應用程序。

+0

我編輯了我的帖子(解釋錯了 - 今天工作太久......對不起)。爲了糾正自己:每個網站都有自己的網站和應用程序文件夾,並擁有自己的緩存和WebsiteKernel。所以緩存是沒有問題的。我現在明白,我不能使用教義功能,因爲它的服務尚未初始化。所以我有兩種選擇:a)加載所有包並處理應用程序內的訪問權限(我已經這樣做)或 b)將允許的包保存在website-config-file中,我可以在WebsiteKernel中讀取以註冊動態捆綁。 您是否看到使用解決方案b)的任何問題? – SusiMage

+0

接受這個答案是正確的答案,因爲它明確表示,爲什麼你不能在AppKernel中使用教義函數。 – SusiMage