2015-10-14 78 views
1

我想在域驅動設計方法中使用Doctrine來實現數據持久性。但是困擾我的是關聯映射應該在實體內部的事實。就純DDD而言,這不是一個壞習慣嗎?因爲在進入持久性問題之前,我的域實體非常乾淨,現在他們在其屬性中有很多評論。像這樣:實體內的DDD和Doctrine映射

<?php 

namespace Domain\Model; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity 
*/ 
class User 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="SEQUENCE") 
    * @ORM\SequenceGenerator(sequenceName="user_id_seq", allocationSize=1, initialValue=1) 
    * @ORM\Column(type="integer") 
    */ 
    private $id; 

    ... 

除了使用這些評論,我還必須有use Doctrine\ORM\Mapping as ORM;。這樣,基礎設施就不會與域保持分離。

有沒有辦法將這個映射移動到配置文件?我正在使用ZF2。

+5

學說2支持YAML和XML映射。只需搜索ZF2文檔,瞭解如何在其框架中執行此操作。我使用Symfony 2,所以我不能給你具體細節,但我相信它可以完成。 – Cerad

+0

這工作!謝謝你的回答。我對Zend使用了這種方法:https://www.kerstner.at/en/2014/04/managing-doctrine-2-entity-model-classes-using-yamldriver-in-zend-framework-2/ –

回答

2

是的,這從DDD的角度來看是不好的。有兩種解決方案:

  • 使用外部映射機制,例如@Cerad描述的機制。這樣可以將域模型從持久性問題中解放出來,但是它也可能是一個難以管理的問題。畢竟,出於某種原因,許多項目都從基於XML的持久性配置中移除。

  • 創建單獨的持久性模型。這個模型非常簡單,根本不包含任何邏輯,只是數據。然後,創建一個映射器來映射這兩者之間的映射。

+0

謝謝爲了回答。我使用了@Cerad提供的第一個解決方案。關於第二種解決方案,我是否應該有2個代表用戶的實體?一個用於域,另一個用於持久性? –

+0

@RodrigoOtavio是的,雖然我不會將持久對象稱爲實體以避免混淆。 – theDmi

0

洋蔥架構已經回答你的問題,是推薦的建築之一DDD方法。我保持域圖層的想法只包含業務邏輯。 infrasctruture層將具有存儲庫。它是存儲庫的工作,用於保留在域對象中所做的更改。因此,如果您使用的是ORM,那麼您應該維護您的映射。下面是關於如何在DDD實現庫一great post,希望它能幫助,

https://codingcraft.wordpress.com/2015/10/12/implementing-repository-in-ddd-part-1/