在我的项目中我管理用户,用户名和密码都是强制性的(因为我使用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进行更新。该逻辑是在交易中执行的,以避免使用第二个冲洗失败的用户。