2010-09-29 177 views
9

我有一個與Doctrine 2和Zend Framework相關的問題。當使用Doctrine 2和Zend Framework時,應該在哪裏放置業務邏輯

如果您在默認情況下使用沒有Doctrine的Zend Framework,則將業務邏輯放入模型中。但是因爲Doctrine 2確實有實體應該在哪裏放置商業邏輯?

我第一次創建了實體管理器調用實體的模型。但是當我想爲沒有數據庫調用的模型編寫單元測試時。我需要將實體經理移動到控制器。但我在我的控制器中獲得業務邏輯,這是不好的。

下面的代碼顯示的控制器操作的一部分:

 $customerAddress = $this->_model->save($values, $id); 

     $this->_em->persist($customerAddress); 

     // Update default billing address 
     $defaultBilling = $this->_model->saveDefaultBilling($values, $customerAddress); 
     if ($defaultBilling != FALSE) { 
      $this->_em->persist($defaultBilling); 
     } 

     // Update default shipping address 
     $defaultShipping = $this->_model->saveDefaultShipping($values, $customerAddress); 
     if ($defaultShipping != FALSE) { 
      $this->_em->persist($defaultShipping); 
     } 

     $this->_em->flush(); 

有人可以說什麼是這個問題的最佳做法是什麼? Thx

+0

我認爲這是最好的,所有的學說代碼移出控制器,進入領域類,請查看我的博客文章:http://www.cobbweb.me/2010/11/integrate-doctrine- 2-zend-framework-application/ – Cobby 2010-11-23 00:15:00

回答

13

我不確定是否有一致同意的最佳實踐,但在討論Doctrine或Zend Framework時,我看到很多關於服務層的討論。

當我開始我的應用程序學說,我試圖建立儘可能多的功能集成到我的實體對象,我可以,但很快就意識到沒有注入實體管理器,它完全打破了平原,非持久性的想法,幾乎是不可能的使Doctrine 2非常好的意識對象。

如果您來自Active Record世界,很容易將您的'模型'視爲與數據庫表對應的單個對象,並且控制器必須與這些對象進行對話。對於非常簡單的CRUD應用程序,這通常是可以的。但是,由於教義的方法,這樣做是奇怪和令人沮喪的。

相反,請考慮應用程序中的不同層。 Doctrine是一個位於數據庫之上的圖層,您的實體位於Doctrine之上,您的服務層應該位於您的實體之上。整個包是MVC中的M,它包含數據持久性和業務邏輯。

我建議你看看這個話題presentation

UPDATE

我原來錯過了,你提到你有做對實體調用單獨的模型對象的一部分。我認爲這將是一個可以接受的模式。如果你想在不進行數據庫調用的情況下編寫測試,那麼你可能會想要使用Entity Manager的模擬 - 無論你將哪一層放入,它都是一個依賴。

+0

我認爲這裏的訣竅是設計你的模型,使其與持久性無關,也就是說,它可以通過全新調用new並從文字設置屬性完全實例化。每個協作中的每個需要的對象都應該可以通過遍歷對象圖來訪問(通過由原則的關係映射創建的對象引用),因此實體中不需要實體管理器。 – 2013-02-19 23:32:55

相關問題