2011-09-05 58 views
1

我想實體管理器傳遞到服務,但還沒有找到一個正確的路要走。我想完成從控制器中刪除em,這就是爲什麼我找到另一種方式。傳遞實體管理器服務層ZF Doctrine2

我想這個選擇: 1.我可以將其保存在註冊表中,然後嘗試從服務對象訪問它。我可以從那裏訪問註冊表嗎? 2.注入的EM在引導服務基類的靜態變量。

什麼是正確的方法喲做呢?

感謝

回答

1

沒有什麼錯,IMO,有讓你的控制器瞭解EM。我通常使用Zend_Application_Resource來引導原則。該資源便於引導資源,稱爲「教條」,其具有EM可用。抽象控制器實現和em()方法,它返回EM。

當實例化服務類,構造簡單地通過在構造時間這個 - $> EM()的調用注入的EM。

這很好,很多時候,簡單的控制器動作不需要任何特殊的服務類,但是可以避開做$entity = $this->em()->getRepository('Some\Entity')->find(1);在這種情況下,我沒有看到任何理由通過服務類進行額外的重定向。

2

我普遍認爲這樣做是通過EntityManager的作爲參數傳遞給構造函數的最佳方式。

這使得您可以在進行單元測試時輕鬆替換entitymanager,而不像1和2的方法,它不依賴於基類或全局數據中的行爲(註冊表很像全局變量)

你可以做些什麼來避免觸摸你的控制器中的EM是使用依賴注入容器,比如Symfony2中的或ZF2中的那個(不知道該組件是否非常穩定)。

另一個可能稍微簡單的辦法是有一個不大不小的「服務定位器」對象,你會在控制器中使用,讓您的服務的實例。你可以用服務與創建它們一個工廠類初始化引導文件中,定位器,或者可能。

在任何情況下,你可能會需要至少某種控制器中間的對象。個人而言,我實在不明白的問題與簡單地使用EM本身,除非你有除了剛纔不想其他一些原因。