我正在使用RegisterUser的EventListener上的FOSUserBundle。
在这个包中,当我创建一个用户时,我使用方法updateUser()(在Vendor ... Model / UserManagerInterface中)。此方法似乎受EventListener的约束,该EventListener至少触发两个操作。注册在数据库中输入的信息。并向用户发送电子邮件以向他发送登录凭据。
我找到了发送邮件的方法。通过利弊,我没有找到录音的人。我也没有找到设置这两个事件的地方。
首先(和我的个人信息),我试图找到这两点仍然未知。如果有人可以指导我?
然后,根据我们对客户的决定,我可能会收取附加费(我仍然不知道该怎么做),我想我的两个陌生人找到后会发现一点好转: - )
感谢您的关注和帮助: - )
答案 0 :(得分:0)
这是处理registrationSucces
上的电子邮件确认的函数FOS \ UserBundle \事件监听\ EmailConfirmationListener
public function onRegistrationSuccess(FormEvent $event)
{
/** @var $user \FOS\UserBundle\Model\UserInterface */
$user = $event->getForm()->getData();
$user->setEnabled(false);
if (null === $user->getConfirmationToken()) {
$user->setConfirmationToken($this->tokenGenerator->generateToken());
}
$this->mailer->sendConfirmationEmailMessage($user);
$this->session->set('fos_user_send_confirmation_email/email', $user->getEmail());
$url = $this->router->generate('fos_user_registration_check_email');
$event->setResponse(new RedirectResponse($url));
}
但我告诉你,你要做的是一个不好的做法。建议的方法如下。
步骤1:选择以下事件之一进行收听(取决于您希望何时捕获该过程)
/**
* The REGISTRATION_SUCCESS event occurs when the registration form is submitted successfully.
*
* This event allows you to set the response instead of using the default one.
*
* @Event("FOS\UserBundle\Event\FormEvent")
*/
const REGISTRATION_SUCCESS = 'fos_user.registration.success';
/**
* The REGISTRATION_COMPLETED event occurs after saving the user in the registration process.
*
* This event allows you to access the response which will be sent.
*
* @Event("FOS\UserBundle\Event\FilterUserResponseEvent")
*/
const REGISTRATION_COMPLETED = 'fos_user.registration.completed';
步骤2实施优先级为Event Subscriber
public static function getSubscribedEvents()
{
return array(
FOSUserEvents::REGISTRATION_SUCCESS => [
'onRegistrationSuccess', 100 //The priority is higher than the FOSuser so it will be called first
],
);
}
第3步实施你的功能
public function onRegistrationSuccess(FormEvent $event)
{
//do your logic here
$event->stopPropagation();//the Fos User method shall never be called!!
$event->setResponse(new RedirectResponse($url));
}
在这种情况下,您永远不应该修改第三方库,为此事件调度程序系统提前处理事件,如果需要,则停止传播并避免“重新处理”事件。
希望它有帮助!!!!