Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 仅在某些情况下调用Symfony事件_Php_Symfony_Doctrine Orm - Fatal编程技术网

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

Php 仅在某些情况下调用Symfony事件,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,在我的项目中,我管理用户,用户名和密码都是强制性的(因为我使用FOSUserBundle),我可以通过两种方式处理它们: 如果用户有权访问管理区域,则用户名和密码应由注册用户设置(例如:myusername/mYpAsSwOrD) 如果用户无权访问管理区域,则默认情况下会定义此用户名和密码(例如user123,pass123,其中123是用户ID) 我对symfony中eventListener/dispatcher的微妙之处并不完全放心 为了有这样的行为,我创建了一个监听器: use Do

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

  • 如果用户有权访问管理区域,则用户名和密码应由注册用户设置(例如:myusername/mYpAsSwOrD)
  • 如果用户无权访问管理区域,则默认情况下会定义此用户名和密码(例如user123,pass123,其中123是用户ID)
我对symfony中eventListener/dispatcher的微妙之处并不完全放心

为了有这样的行为,我创建了一个监听器:

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 }
但这显然不起作用:因为这是一项服务,所以每次我添加更新用户时,它都会应用

我的问题是: 如何仅在需要时应用此侦听器:?

  • 仅在插入时(不在更新时)
  • 只有在控制器中“我要求”

=>也许我错了,但我无法将参数从控制器传递到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进行更新。此逻辑在事务中执行,以避免在第二次刷新失败时使用随机名称的用户。

检查unitofwork,查看更改集是什么,确定是否运行代码。因此,在这种情况下,我不会使用任何侦听器?是的,您会使用,但在该侦听器中,您可以检查,确切地说,用户实体中发生了什么变化,如果相关内容发生了变化,则只运行setter、persist和flush。。还是我误解了这个问题?重要的不是我的实体中发生了什么变化,而是在什么情况下会发生这种持久性(与用户实体无关)我只想在某些情况下更改此用户名/密码。但我不知道如何在这样的侦听器中传递参数:保持简单:仅当
$isRegularUser==true
时,如何运行此postPersist。你有任何链接或例子,我可以看看吗?谢谢,您可能不想在这种业务逻辑中使用条令事件。看起来您可以在控制器中正确地实现这一点,但如果不能,请使用Symfony事件系统。