2012-04-18 13 views
0

私はブログアプリケーションを書いていると仮定します:私のPostsエンティティはcreateddate,modifieddatenameslugのプロパティを持ちます(エンティティに対してsetName()を呼び出すと、slugが生成されます)。私はこのコードを再利用したいが、にオンデマンドでを再利用したい。私は、例えば、createddateを使用したいLogエンティティを持っているかもしれませんが、modifieddateまたはslugの機能性を持っていません。 traits(ミックスイン)または抽象クラスを経由して、不十分な、または少なくとも不適切と思われる、それはを通過しないように、この機能を再利用する手法であるかどうか、試験Doctrine 2エンティティで列とイベントを再利用するにはどうすればよいですか?

クラスの継承。結局のところ、エンティティは、 createddateを持っていますが、作成日自体ではありません。継承よりもむしろCompositionを使用する必要があります。私はオンデマンドこの機能を使用する一方で、注釈およびオブジェクトのプロパティの教義の使用は、水平方向の注入が困難になるように見えるので、observerは、ここで働いていないようだ(そして高価な?)Reflectionを使用せずに。 私はすぐにDRYや良いOOP(構成/継承の適切な使用)を壊すことなく、以下の定義と機能をエンティティに注入できますか?

/** 
* @var DateTime $createddate 
* 
* @ORM\Column(type="datetime") 
*/ 
private $createddate; 

/** 
    * @ORM\PrePersist 
    */ 
public function createddatePrePersist() { 
    $this->createddate = new \DateTime('now'); 
} 

答えて

4

私の個人的な意見では、あなたのハンマーのために釘を見つけるためにしようとしているということです。 には、すべてのエンティティの構成、継承、特性、または任意のOOPパターンを使用するためのがありません。

私はcreationDateが私のエンティティの固有の特性であり、および作成日を必要とするエンティティは、このプロパティを持っていることを考慮する傾向があります。私はそれが自分自身を繰り返すと主張するかもしれないが、私の意見では、全体のエンティティを読みやすくする。

ああ、私は可能性がある場合、私は、作成日を初期化するために、私のドメインモデルの一部ではないORM固有の方法を、使用することはありません。これは私のコンストラクタで行われることになります。

/** 
* @var DateTime $createddate 
* 
* @ORM\Column(type="datetime") 
*/ 
private $createddate; 

public function __construct() 
{ 
    $this->createddate = new \DateTime(); 
    // ... and other business rules that need to be enforced in the constructor 
} 
関連する問題