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