2011-10-28 15 views
15

同じエンティティ内に私はPreUpdateとPrePersistがあります。 PreUpdateは起動しますが、PrePersistは実行しません。私はdie()をフラッシュし、ライフサイクルコールバック内にコメントします。完全なエンティティはDoctrine 2 PrePersistは起動しません。

/** 
* @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メッセージhttp://pastebin.com/yUk1u4GQ

エンティティのコールバックで見ることができます。私はエンティティの上部に@HasLifecycleCallbacksを持っています。

答えて

34

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

テストするときに、エンティティ属性が実際に変更された場合にのみUPDATEステートメントが起動されることを忘れないでください。 Entity Managerがそのエンティティを保持するために呼び出されている場合、Entity Managerは最初に変更があるかどうかを調べます。そうでない場合、SQLクエリは実行されず、​​メソッドは呼び出されません。

+0

Upvoted。 期待通りにコードが機能していないときに、これを難しい方法で見つけました(ステップデバッグを介して)。現在のドキュメントでは、簡単な間違いがあるため、これを十分に明確にしていません。 – iainp999

4

私はちょうど同じ問題を抱えていました。これがあなたに役立つことを願っています:

私はuseステートメントで注釈をインポートするのを忘れました。あなたは、このいけない「​​ORM」プレフィックスを追加することを忘れしよう:

use Doctrine\ORM\Mapping as ORM; 

// ... 

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

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

/** 
* Report\MainBundle\Entity\Serveur 
* @ORM\HasLifecycleCallbacks 
*/ 
class Serveur { 
+0

これは私の問題でした。ありがとう! – jasonlfunk

+0

あなたの答えは私の問題を解決します。ありがとう! –

+0

'@ HasLifecycleCallbacks'が見つかりませんでした。ありがとう! – MParsons

9

私が知っているこの質問は、ほぼ2歳私はちょうど同じ問題を抱えていました。これには受け入れられた答えがないので、他の人が言いたいことを忘れてしまいました。

トリガされたメソッドは、エンティティクラス自体でのみ使用されるようですが、有効範囲を公開する必要があります。私の方法は、私が保護されているとマークしただけなので、トリガーしていませんでした。これが誰かを助けることを願っています。

3

多分それバージョンに依存しますが、私の作業の注釈は次のビューがあります。

ライフサイクルクラス注釈:

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

イベント注釈:

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

私が持っているすべてでありますモデル。

+0

はい! Doctrine 2のドキュメントに従う @ PrePersistイベントとして呼び出されるエンティティのメソッドをマークします。 エンティティクラスPHP DocBlockの@ HasLifecycleCallbacksでのみ動作します。 –

関連する問題