2016-03-22 10 views
3

例を挙げることができますか? エンティティProjectEvent - 多くのイベントを1つのプロジェクトにするため、ステータスプロジェクトが'closed_by_client'に変更されると、このプロジェクトのイベントを作成する必要があります。コントローラでSymfonyイベントリスナ - エンティティを設定する

$project = $this 
    ->getDoctrine() 
    ->getManager() 
    ->getRepository('ArtelProfileBundle:Project') 
    ->find($id); 

     $project->setCurrentStatus('closed_by_client'); 
     $manager->persist($project); 
     $manager->flush(); 

プロジェクトエンティティ:

/** 
* Project. 
* 
* @ORM\Table(name="project") 
* @ORM\HasLifecycleCallbacks 
* @Gedmo\SoftDeleteable(fieldName="deletedAt") 
* @ORM\Entity(repositoryClass="Artel\ProfileBundle\Entity\Repository\ProjectRepository") 
* @ExclusionPolicy("all") 
*/ 
class Project 
{ 
const STATE_TO_BE_INDEXED_IN_ELA_NOT_APPROVED = 'not_approved'; 
const STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT = 'closed_by_client'; 

use Timestampable; 
/** 
* @var int 
* 
* @ORM\Column(name="id", type="integer") 
* @ORM\Id 
* @Expose() 
* @ORM\GeneratedValue(strategy="AUTO") 
*/ 
private $id; 

/** 
* @ORM\Column(name="current_status", type="string", length=100, nullable = true) 
* @Expose() 
* @Type("string") 
*/ 
protected $currentStatus = 'not_approved'; 

/** 
* @ORM\OneToMany(targetEntity="CodeEvents", mappedBy="project", cascade={"persist", "remove"}) 
*/ 
protected $events; 

/** 
* @ORM\PrePersist() 
*/ 
public function PrePersist(){ 
    if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){ 
     $event = new CodeEvents(); 
     $event 
      ->setProject($this) 
      ->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT) 
     ; 
    } 
} 

/** 
* @ORM\PreFlush() 
*/ 
public function PreFlush(){ 
    if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){ 
     $event = new CodeEvents(); 
     $event 
      ->setProject($this) 
      ->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT) 
     ; 
    } 
} 

私は多分このような何かを行うことができると思いますが、DB内のエンティティEventフラッシュません:

/** 
* @ORM\PrePersist() 
*/ 
public function PrePersist(){ 
    if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){ 
     $event = new CodeEvents(); 
     $event 
      ->setProject($this) 
      ->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT) 
     ; 
    } 
} 

/** 
* @ORM\PreFlush() 
*/ 
public function PreFlush(){ 
    if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){ 
     $event = new CodeEvents(); 
     $event 
      ->setProject($this) 
      ->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT) 
     ; 
    } 
} 

I add

/** 
* @ORM\PreFlush() 
*/ 
public function PreFlush(LifecycleEventArgs $event){ 
    $entityManager = $event->getEntityManager(); 
    if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){ 
     $event = new CodeEvents(); 
     $event 
      ->setProject($this) 
      ->setEvent(self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT) 
     ; 
     $entityManager->persist($event); 
     $entityManager->flush(); 
    } 
} 

が、エラー

`Catchable Fatal Error: Argument 1 passed to Proxies\__CG__\Artel\ProfileBundle\Entity\Project::PreFlush() must be an instance of Doctrine\ORM\Event\LifecycleEventArgs, instance of Doctrine\ORM\Event\PreFlushEventArgs given, called in /home/ivan/host/aog-code/vendor/doctrine/orm/lib/Doctrine/ORM/Event/ListenersInvoker.php on line 102 and defined` 

がどのようにイベントのリスナーを作成しなければならないときフラッシュエンティティ - 「closed_by_client」の実体プロジェクトの変更ステータスを - エンティティイベントを作成しますか?

私は初期イベントを作成しませんでした。このビジネスロジックのイベントを作成する方法は?

+1

ビジネスロジックをデータベースレイヤーと混在させています。 'user [x] closed project 'のような' events'を作成することは、実際にはdoctrineの仕事ではなく、あなたのアプリケーションの仕事です。実際にエンティティへのデータの永続化を担当する別個のビジネスロジッククラスを作成する必要があります。これは、使用しているデータベースに依存しないでください。あなたはこれのためにDAOを作ることができます。そして、 'onUserClosedProject'イベントが呼び出されたときにいくつかのコードを実行するsymfonyにイベントリスナーを登録します。ユーザーとそのイベントをその関数に渡すことができます。 – giorgio

+0

私は初期イベントを作成しませんでした。このビジネスロジックのイベントを作成する方法は? –

+0

更新私の質問 –

答えて

0

prePersistメソッドとpreFlushメソッドがProjectクラス自体の中にあることを考慮してください。あなたのイベントのオブジェクトに追加するにはあなただけの$thisを使用する必要があります。

タイトルで
public function PrePersist(){ 
    if($this->getCurrentStatus() == self::STATE_TO_BE_INDEXED_IN_ELA_CLOSED_BY_CLIENT){ 
     $event = new CodeEvents(); 
     $event->setProject($this); 
    } 
} 
+0

しかし、コントローラであれば、 '$ potentialClient =の$ this - > getDoctrine() - > getManager() - > getRepository( 'ArtelProfileBundle:プロジェクト') - >検索する($のID);'と '$ event-> setProject($ this); 'set existプロジェクト?または独立したリスナーを作成する方法は? –

+0

私の質問を更新する –

0

あなたはsymfonyのイベントリスナーについて尋ねていますが、実際に教義のイベントリスナーを使用しました。ここ

マイノート:

1、あなたはSymfony2のイベントを作成し、あなたの教義のイベントから、それを起動する必要があります。 symfony2イベントを発生させたい場合は、フレームワークイベントディスパッチャーにアクセスする必要があるため、少し複雑になります。そのイベントをLifeCycleEventListenerに注入する必要があります。 ので:

2ステータスフィールドがまったく変更された場合、私はそうでなければ、(CodeEventの多くを作成し、チェックを検討する)のインスタンス時に他のプロパティプロジェクトエンティティの変更やステータスがすでにある「closed_by_client」 参照してください。ここでは: http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-callbacks-event-argument

+0

私は試してみるが、それはすべて、多分私のためのいくつかの例を非常に助けるような偉大な経験を持っていない –

+0

私は教義のエンティティリスナーであなたのロジックを実装することをお勧めし、 Symfonyイベントリスナーを回ります。 (実際にはすでにイベントシステムを使用していますが、他のロジックを実行したくない場合は、そのイベントシステムに留まるだけで十分です)。 – Andras

+0

私はあなたのオープニングの質問にコメントするのに十分な評判を持っていませんが:パラメータの型のヒントが間違っている '' 'PHP パブリック関数プレフラッシュ(LifecycleEventArgs $イベント){ } ' '' 、このリスナーはオンになっています取得別のエンティティを、フラッシュする教義イベント '@ORM \プレフラッシュを(使用している場合は、エンティティ、それは ' '' PHP パブリック関数プレフラッシュ(PreFlushEventArgs $イベント)でなければなりませんので、{ } '' ' – Andras

関連する問題