web-dev-qa-db-ja.com

Doctrine 2PrePersistが起動しない

同じエンティティ内に、PreUpdateとPrePersistがあります。 PreUpdateは起動しますが、PrePersistは起動しません。ライフサイクルコールバック内のフラッシュとコメントの後にdie()を置きます。完全なエンティティは http://Pastebin.com/yUk1u4GQ で見ることができます

エンティティコールバック

/**
* @PreUpdate
*/
public function fixDates(){
    $this->updatedOn = $this->getNow();
    $this->closedDate = null;
    $this->openDate = null;
    print "dates fixed";
}

/**
* @PrePersist
*/
public function prePersist() {
    print 'in prePersist';
    die();
}

エンティティマネージャーの呼び出し

$em->persist($school);

$em->flush();
die();

画面に「修正日」と表示されますが、prePersistメッセージは表示されません。エンティティの上部に@HasLifecycleCallbacksがあります。

22
Tom

PrePersistは、INSERTステートメントではなく、UPDATEステートメントを実行している場合にのみ発生します。

テストするときは、エンティティの属性が実際に変更された場合にのみUPDATEステートメントが実行されることを忘れないでください。エンティティマネージャがそのエンティティを永続化するために呼び出されている場合、最初に変更があるかどうかを調べます。そうでない場合、SQLクエリは実行されず、@PreUpdateメソッドが呼び出されます。

37
Johan

クラスアノテーションでライフサイクルコールバックを有効にすることを忘れないでください:

/**
 * Report\MainBundle\Entity\Serveur
 * @ORM\HasLifecycleCallbacks
 */
class Serveur {
59
Thierry Daguin

この質問はほぼ2年前のものですが、まったく同じ問題が発生しました。これには受け入れられた回答がないため、他の人が言及し忘れた最後の1つを共有したいと思います。

トリガーされたメソッドはエンティティクラス自体によってのみ使用されるようですが、そのスコープは公開しておく必要があります。保護されたメソッドとしてマークしたからといって、メソッドがトリガーされませんでした。これが誰かの助けになることを願っています。

11
Martini

私はちょうど同じ問題を抱えていました。これがお役に立てば幸いです。

Useステートメントでアノテーションをインポートするのを忘れました。これを試す場合は、「ORM」プレフィックスを追加することを忘れないでください。

use Doctrine\ORM\Mapping as ORM;

// ...

/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
}
6
Besnik

たぶんそれはバージョンに依存しますが、私の作業アノテーションには次のビューがあります:

ライフサイクルクラスアノテーション:

/**
 * @Entity @Table(name="table_name")
 * @HasLifecycleCallbacks
 **/

イベントの注釈:

/** @PrePersist **/
/** @PreUpdate **/

それは私がモデルに持っているすべてです。

3
Aleksej