FOSUserBundle,EventListener注册用户

时间:2018-05-15 13:56:48

标签: symfony fosuserbundle registration event-listener

我正在使用RegisterUser的EventListener上的FOSUserBundle。

在这个包中,当我创建一个用户时,我使用方法updateUser()(在Vendor ... Model / UserManagerInterface中)。此方法似乎受EventListener的约束,该EventListener至少触发两个操作。注册在数据库中输入的信息。并向用户发送电子邮件以向他发送登录凭据。

我找到了发送邮件的方法。通过利弊,我没有找到录音的人。我也没有找到设置这两个事件的地方。

首先(和我的个人信息),我试图找到这两点仍然未知。如果有人可以指导我?

然后,根据我们对客户的决定,我可能会收取附加费(我仍然不知道该怎么做),我想我的两个陌生人找到后会发现一点好转: - )

感谢您的关注和帮助: - )

1 个答案:

答案 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));
    }

在这种情况下,您永远不应该修改第三方库,为此事件调度程序系统提前处理事件,如果需要,则停止传播并避免“重新处理”事件。

希望它有帮助!!!!