FOSUserBundle, EventListener registration user

笑着哭i 提交于 2019-12-11 17:24:58

问题


I'm working on the FOSUserBundle, on EventListener for RegistrationUser.

In this bundle, when I create a user, I use a method updateUser() (in Vendor...Model/UserManagerInterface). This method seems to be subject to an EventListener that triggers at least two actions. Registering the information entered in the database. And sending an email to the user to send him login credentials.

I found the method that send the mail. By cons, I didn't find the one who makes the recording. I also didn't find where to set the two events.

First for all (and my personnal information), I try to find these two points still unknown. If anyone could guide me?

Then, depending on what we decide with our client, I may proceed to a surcharge (wich I still don't really know how to do), bu I imagine that I would find a little better once my two strangers found :-)

Thank's for your attention and help :-)


回答1:


This is the function wich handles the email confirmation on registrationSucces

FOS\UserBundle\EventListener\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));
    }

But I tell you that what you are trying to do is a bad practice. The recommended way is the following.

Step 1: Select one of the following events to listen(depending on when you want to catch the process)

/**
     * 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';

Step 2 Implement the Event Subscriber with a priority

    public static function getSubscribedEvents()
    {
        return array(
            FOSUserEvents::REGISTRATION_SUCCESS => [
                'onRegistrationSuccess', 100 //The priority is higher than the FOSuser so it will be called first
            ],
        );
    }

Step 3 Implement your function

public function onRegistrationSuccess(FormEvent $event)
    {
       //do your logic here

        $event->stopPropagation();//the Fos User method shall never be called!!
        $event->setResponse(new RedirectResponse($url));
    }

You never should modify the third party libraries in this case the Event Dispatcher System is made for this to earlier process the event and if its needed stop the propagation and avoid the "re-processing" of the event.

Hope it helps!!!!



来源:https://stackoverflow.com/questions/50352121/fosuserbundle-eventlistener-registration-user

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!