2017-05-05 7 views
0

を私はユーザーを管理し、(私はFOSUserBundleを使用しているため)ユーザ名とパスワードの両方が必須で、私は2つの方法でそれらを処理することができます:コールsymfonyのイベント

  • ユーザーの場合ユーザ名とパスワードは、ユーザ登録(例:myusername/mYpAsSwOrD)で設定する必要があります。
  • ユーザが管理領域にアクセスすべきでない場合、このユーザ名とパスワードはデフォルトで例えば、user123、pass123、123はユーザIDです)

私は、symfonyのeventListener/dispatcherのサブタイトルを完全に使いこなせるわけではありません。

mybundle.user_listener: 
    class: MyBundle\EventListener\UserListener 
    tags: 
     - { name: doctrine.event_listener, event: postPersist } 

しかし、これはobiously動作しません:サービスで

use Doctrine\ORM\Event\LifecycleEventArgs; 

use MyBundle\Entity\User; 

class UserListener 
{ 
    public function postPersist(LifecycleEventArgs $args) 
    { 
     $entity  = $args->getEntity(); 
     $em   = $args->getEntityManager(); 

     if ($entity instanceof User) { 
      $entity->setUsername('user'.$entity->getId()); 
      $entity->setPassword('user'.$entity->getId()); 
      $entity->setEmail('user'.$entity->getId()); 

      $em->persist($entity); 
      $em->flush(); 
     } 
    } 
} 

:私はリスナーを作成して、そのような行動させるためには

これはサービスであるために、それは私はユーザーの更新を追加するたびに適用されます。

私の質問は: 私はそれが必要なときだけこのリスナーを適用できますか?のみ挿入で(ない更新上)

  • コントローラに

=>たぶん私が間違っているが、私は、パラメータを渡すことはできません「私はそれを求める」場合にのみ、コントローラーからpostPersistイベントへ?

+0

チェンジセットの内容を確認し、コードを実行するかどうかを決定してください。 –

+0

その場合、リスナーは使用しませんか? – Overdose

+0

はい、そうですが、このリスナーの中で、あなたのユーザーエンティティで何が変更されたかを正確に確認し、セッターだけを実行して、永続的にフラッシュしてください。関連するものが変更された場合や、 –

答えて

0

このケースでは、リスナーでこのタイプのロジックを使用しないことをお勧めします。特定のケースでは、別の場所でユーザーを作成しようとすると混乱することがあります。

は、お使いのコントローラやリポジトリに例をこのロジックを実装できます

class UserRepository extends EntityRepository 
{ 
    public function saveUser(User $user, $autoGenerated = false) 
    { 
     $this->_em->beginTransaction(); 

     if ($autoGenerated) { 
      $user->setUsername('user'.time()); 
      $user->setPlainPassword('user'.time()); 
      $user->setEmail('user'.time().'@example.com'); 
     } 
     $this->_em->persist($user); 
     $this->_em->flush($user); 

     $this->_em->refresh($user); 

     if ($autoGenerated) { 
      $user->setUsername('user'.$user->getId()); 
      $user->setPlainPassword('user'.$user->getId()); 
      $user->setEmail('user'.$user->getId().'@example.com'); 
     } 

     $this->_em->flush($user); 

     $this->_em->commit(); 

     return $user; 
    } 
} 

は、まず、ユーザは、ランダムな名前で保存し、他のフラッシュの本当のIDで更新されます。このロジックはトランザクションで実行され、2回目のフラッシュに失敗した場合にユーザーがランダムな名前を持つことを回避します。

関連する問題