3

Doctrine ORM で Silex を使用しています。すべて正常に動作していましたが、理解できない問題が発生しました。

私は名前空間 Lpdq\Model\Entity に Entity News を持っています。これは名前空間 Lpdq\Model の別のクラス News を拡張します。このクラスには教義のためのいくつかのメソッドとイベント前後のメソッドが含まれています。

私のエンティティニュース

<?php

namespace Lpdq\Model\Entity;

/**
 * News
 * 
 * @Table(name="news")
 * @Entity(repositoryClass="Lpdq\Model\Entity\Repository\News")
*/
class News extends Lpdq\Model\News{
 /*some properties/methods*/
}

私のスーパークラスのニュース

<?php

namespace Lpdq\Model;
/**
 * News
 * 
 * @MappedSuperclass
 * @HasLifecycleCallbacks
*/
class News{

   /**
    * @PrePersist
    */
    public function prePersist()
    {
        $this->setCreated(new \DateTime());
        $this->setUpdated(new \DateTime());
    }

    /**
     * @PreUpdate
     */
    public function preUpdate()
    {
        $this->setUpdated(new \DateTime());
    }

    /*...some methods...*/
}

私のコントローラーでは、エンティティをインスタンス化して永続化/フラッシュするだけです

<?php

namespace Lpdq\Controller;

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Lpdq\Model\Entity\News;

class NewsController {

    public function addAction( Request $request, Application $app) {
        $news = new News();
        $news->setTitle('test');
        /*...*/
        $app['orm.em']->persist($news);
        $app['orm.em']->flush();

        /*...*/
    }
}

私の問題は、エンティティを永続化するときに prePersist/preUpdate メソッドが呼び出されないことです。 (作成および更新されたプロパティがnullであるため、エラーが発生します)

エンティティ News を HasLifecycleCallbacks として設定し、同じ prePersist/Update メソッドを配置すると、それらがトリガーされます。

私がここにいる間、エンティティを拡張して事前/事後およびその他の方法を配置する方法が良いか悪いか疑問に思っていますか?

4

2 に答える 2

0

同じメソッドのセットを必要とする複数のエンティティがある場合、基本クラスのニュースを持つことは理にかなっています.1つのエンティティのみがクラスのニュースを拡張している場合、それはやり過ぎであり、エンティティクラス自体にコードを配置できます.

一般的なパターンは、複数のエンティティがあり、それらすべてのフィールドが作成および更新されている場合、基本クラスを作成し、そのようなエンティティはすべてそれを拡張する必要があります。

Lifecycle コールバックを有効にするには、アノテーション HasLifecycleCallbacks が必要です。基本クラスから拡張するすべてのエンティティにライフサイクル イベントが適用される場合は、注釈を基本クラスに配置する必要があります。それ以外の場合は、個々のクラスに配置します。

于 2014-12-12T14:03:22.013 に答える