2012-07-04 5 views
9

私は一つの問題がある場合、エンティティを保存キャンセルする方法:プロセスでは、私はprePersit関数の実体保存キャンセルしたい:prePersist機能での滞在は

/** 
* @ORM\PrePersist 
*/ 
public function setTranslationsValue2() 
{ 
    if((null===$this->getContent())or($this->getContent()=='')) 
    { 
     //wanna stop saving this item??? 
     return false; 
    } 
} 

上記の関数では、私はしたくありませんこのエンティティをもう保存しないで、プロセスを停止したくない場合(プロセスはまだ別のプロセスを保存しています)

答えて

4

エンティティ内でprePersistアノテーションを使用することはできません。あなたのアプローチの問題は、モデル内のentityManagerにアクセスすることはできませんが、エンティティを永続させないようにするには、そのエンティティマネージャが必要になります。

教義のドキュメントで説明したようにあなたは、イベントリスナーを使用することができます。http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listeners

あなたは、その後、prePersistイベントに耳を傾け、問題の種類の任意のエンティティを永続化するために要求するかどうかを確認し、あなたの条件があるかどうかを確認します本当。そうであれば、エンティティをデタッチするようにentityManagerに指示できます。

しかしは、私はあなたがnotNullをにコンテンツを設定し、長さは< 1.正しいエンティティを永続化するために確認している場合はnullにコンテンツを変換することにより、そのはるかに簡単に行うことができると思いますが、あなたのドメインロジックの一部であり、私はしないだろうこれはエンティティ自体または何らかのイベントリスナにあります。あなたがそのようなリスナーと条件の多くを持っているなら、あなたは誰も知らない多くの魔法の拘束で終わります。

上記のアプローチのほかに、valid()メソッドを実装して特定の条件が満たされているかどうかを確認することができます。 valid()がtrueの場合、ドメインロジックはエンティティのみを保持します。より良いアプローチは、symfony2バリデーターを使用してエンティティを検証し、それに従って動作させることです。

+0

ありがとう、私はイベントリスナーを作成しようとします。 – user1501227

+0

文書へのアクセスが制限されているため、リンクを確認してください。私は「あなたはこのバージョンにアクセスできない」と感じています。 –

+0

あなたのヒントをありがとう。新しいリンクはhttp://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#implementing-event-listenersです。私はそれに応じて元の答えを編集しました! – Sgoettschkes

2

新しい例外をスローする(「Some message ...」);

+0

OPは、ソリューションがプロセス全体を停止しないように要求しました。 –

+1

これは、呼び出しコードからExceptionを捕捉し、シナリオを処理する理由です。 – caponica

関連する問題