仅在某些情况下调用Symfony事件



在我的项目中我管理用户,用户名和密码都是强制性的(因为我使用fosuserbundle(,我可以通过两种方式处理它们:

  • 如果用户应可以访问管理区域,则应由用户注册(例如:myusername/mypassword(设置用户名和密码
  • 如果用户无法访问管理区域,则该用户名和密码默认定义(例如,用户123,pass123其中123是用户ID(

我对Symfony中的EventListener/Dispatcher的子接触并不完全放心。

为了拥有这样的行为,我创建了一个听众:

use DoctrineORMEventLifecycleEventArgs;
use MyBundleEntityUser;
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: MyBundleEventListenerUserListener
    tags:
        - { name: doctrine.event_listener, event: postPersist }

但是,这个不起作用:由于这是一项服务,因此每次我添加更新用户时都适用。

我的问题是:仅在需要时才能应用此听众:?

  • 仅在插入(不使用更新(上
  • 仅在控制器"我要求"中

我的建议是不要在侦听器中使用这种逻辑,是一种特殊的情况,而在尝试在其他地方创建用户时,可能会感到困惑。

可以在您的控制器或存储库中实现此逻辑,例如:

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进行更新。该逻辑是在交易中执行的,以避免使用第二个冲洗失败的用户。

相关内容

  • 没有找到相关文章