2017-05-05 70 views
0

在我的項目我管理用戶和包含用戶名和密碼是強制性(因爲我用FOSUserBundle),我可以用兩種方式處理它們:通話的Symfony事件僅在某些情況下

  • 如果用戶應該有機會獲得管理方面,用戶名和密碼應該由用戶註冊設置(如名稱:myusername/MYPASSWORD)
  • 如果用戶不應該進入管理區,這個用戶名和密碼是默認定義(例如user123,pass123其中123是用戶ID)

我並不完全放心symfony中eventListener/dispatcher的subtelties。

爲了有這樣的行爲,我創建了一個監聽器:

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(); 
     } 
    } 
} 

與服務:

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

但這obiously不起作用:因爲這是一個服務,它我每次添加更新用戶都適用。

我的問題是: 我該如何應用這個監聽器只有當我需要它:?

    只有在插入時(而不是在更新)
  • 僅在控制器「我問它」

=>也許我錯了,但我不能傳遞參數從控制器到postPersist事件?

+0

檢查的UnitOfWork,看變更是什麼,確定羯羊或不運行代碼.. –

+0

因此,在這種情況下,我不會用任何監聽器? – Overdose

+0

是的,你可以,但是在這個監聽器裏面,你可以檢查你的用戶實體中發生了什麼變化,並且只運行setter,並且堅持並刷新,如果相關內容已經改變了,或者我誤解了這個問題? –

回答

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; 
    } 
} 

首先用戶保存一個任意名稱,並與其他沖洗真實身份識別碼更新。如果第二次刷新失敗,則在事務中執行此邏輯以避免具有隨機名稱的用戶。

相關問題