Подтверждение по электронной почте на странице редактирования профиля FOSUserBundle


Я хотел бы активировать подтверждение по электронной почте на FOSUserBundle /профиль/редактировать

В /профиль/редактировать вы уже вошли в систему и можете изменить имя пользователя или адрес электронной почты, введя текущий пароль. Теперь я хотел бы отправить электронное письмо с подтверждением, если пользователь изменит адрес электронной почты:)

В справочнике конфигурации FOSUserBundle Я не нашел, чем заняться этот... https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/configuration_reference.md

Вот мои текущие настройки:

fos_user:
  db_driver: orm
  firewall_name: main
  user_class: Acme\CoreBundle\Entity\User
  registration:
    confirmation: { enabled: true }
  from_email:
    address: noreply@%domain%
    sender_name: %site_name% Staff
  resetting:
    token_ttl: %reset_password_ttl%

Кто-нибудь может мне помочь?

Author: Francesco Casula, 2012-04-03

2 answers

Используя новые события FOSUserBundle (функция FOS 2.0), вы можете создать ChangeProfileListener, который обрабатывает изменения электронной почты.

Идея: используйте ту же логику, что и процесс регистрации: отключите нашего пользователя, отправьте ему токен (и выйдите из системы для нашего случая).

Нужно сделать две вещи:

  • создайте описатель событий
  • перепишите файл mail.txt.twig, чтобы заменить сообщение "регистрация" нейтральным сообщением "подтверждение по электронной почте".

Вот мой слушатель, не забудьте заменить пространство имен.

EventListener/ChangeProfileListener.php :

<?php

// src/Fuz/HomeBundle/EventListener/ChangeProfileListener.php

namespace Fuz\HomeBundle\EventListener;

use FOS\UserBundle\FOSUserEvents;
use FOS\UserBundle\Event\GetResponseUserEvent;
use FOS\UserBundle\Event\FormEvent;
use FOS\UserBundle\Mailer\MailerInterface;
use FOS\UserBundle\Util\TokenGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class ChangeProfileListener implements EventSubscriberInterface
{

    private $mailer;
    private $tokenGenerator;
    private $router;
    private $session;
    private $tokenStorage;

    public function __construct(MailerInterface $mailer, TokenGeneratorInterface $tokenGenerator,
       UrlGeneratorInterface $router, SessionInterface $session, TokenStorageInterface $tokenStorage)
    {
        $this->mailer = $mailer;
        $this->tokenGenerator = $tokenGenerator;
        $this->router = $router;
        $this->session = $session;
        $this->tokenStorage = $tokenStorage;
    }

    public static function getSubscribedEvents()
    {
        return array(
                FOSUserEvents::PROFILE_EDIT_INITIALIZE => 'onProfileEditInitialize',
                FOSUserEvents::PROFILE_EDIT_SUCCESS => 'onProfileEditSuccess',
        );
    }

    public function onProfileEditInitialize(GetResponseUserEvent $event)
    {
        // required, because when Success's event is called, session already contains new email
        $this->email = $event->getUser()->getEmail();
    }

    public function onProfileEditSuccess(FormEvent $event)
    {
        $user = $event->getForm()->getData();
        if ($user->getEmail() !== $this->email)
        {
            // disable user
            $user->setEnabled(false);

            // send confirmation token to new email
            $user->setConfirmationToken($this->tokenGenerator->generateToken());
            $this->mailer->sendConfirmationEmailMessage($user);

            // force user to log-out
            $this->tokenStorage->setToken();

            // redirect user to check email page
            $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));
        }
    }

}

Сервисы.yml:

parameters:
    fuz_home.email_change.listener.class: Fuz\HomeBundle\EventListener\ChangeProfileListener

services:
      fuz_home.email_change.listener:
          class: %fuz_home.email_change.listener.class%
          arguments: ['@fos_user.mailer', '@fos_user.util.token_generator', '@router', '@session', '@security.token_storage']
          tags:
            - { name: kernel.event_subscriber }

О перезаписи шаблона электронной почты, это просто создание приложения/Ресурсов/FOSUserBundle/просмотров/Регистрации/email.txt.twig и поместите, например:

{% block subject %}
Email Confirmation
{% endblock %}

{% block body_text %}

Welcome to example.com, {{ user.username }}!                                                

To confirm your email, please follow this link:                                                                    
{{ confirmationUrl }}

You will be able to log-in using the username or email you given:                                        

Username : {{ user.username }}                                                                                                         
Email    : {{ user.email }}                                                                                                 

If you received this e-mail in error just ignore this message. No further actions are required from you.                  



                                                     *****                                                           

                                                 See you soon!
{% endblock %}
 17
Author: Alain Tiemblo, 2015-07-31 07:07:47

Функция отправки электронного письма с подтверждением существует только в

RegistrationFormHandler->onSucces

Где эта переменная конфигурации передается и проверяется. Аналогичной функциональности не существует в профиле/правке:

ProfileFormHandler->onSuccess.

Поэтому вам потребуется переопределить FOS ProfileFormHandler и добавить эту функцию самостоятельно. Это описано в Документация FOSUserBundle: Переопределяющие формы.

 4
Author: MadManMonty, 2013-09-04 13:06:41