1

ブログ アプリを作成しているとします。私のPostsエンティティには、、、、およびプロパティが必要ですcreateddate(エンティティに対して setName() を呼び出すとスラッグが生成されます)。このコードを再利用したいが、オンデマンドで再利用したい。たとえば、機能を使用したいが機能を使用したくないエンティティがある場合があります。modifieddatenameslugLogcreateddatemodifieddateslug

トレイト(ミックスイン) または抽象クラスを介したクラス継承は、 is-aテストに合格しないため、この機能を再利用するには不十分な、または少なくとも不適切なアプローチのようです。結局のところ、エンティティには作成日がありますが、それ自体は作成日ではありません..したがって、継承ではなく構成を使用する必要がありますよね?. ただし、オブザーバーはここでは機能しないようです。この機能を on-demandで使用したいのですが、Doctrine で注釈とオブジェクト プロパティを使用すると、 Reflectionを使用しないと水平方向の注入が困難になる (そして費用がかかる?) ように見えるからです。

いくつかのコードを示して質問を少し単純化するには、DRYまたは適切な OOP (構成/継承の適切な使用) の慣行を破ることなく、次の定義と機能をエンティティに一度に挿入できますか?

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

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

1 に答える 1

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
}
于 2012-04-18T17:33:19.100 に答える