2017-05-05 32 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; 
    } 
} 

首先用户保存一个任意名称,并与其他冲洗真实身份识别码更新。如果第二次刷新失败,则在事务中执行此逻辑以避免具有随机名称的用户。

相关问题