Подтверждение по электронной почте о редактировании профиля 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: AcmeCoreBundleEntityUser
registration:
confirmation: { enabled: true }
from_email:
address: noreply@%domain%
sender_name: %site_name% Staff
resetting:
token_ttl: %reset_password_ttl%
кто может мне помочь?
2 ответов
используя события нового FOSUserBundle (функция FOS 2.0), вы можете создать ChangeProfileListener
что обрабатывать изменения по электронной почте.
идея: используйте ту же логику, что и процесс регистрации: отключите нашего пользователя, отправьте ему токен (и выйдите из него для нашего случая).
есть две вещи :
- создать событие suscriber
- перезаписать почты.формат 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/просмотров/регистрации / электронной почты.формат txt.веточку и положить, например:
{% 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 %}
функциональность для отправки подтверждения по электронной почте существует только в
RegistrationFormHandler->onSucces
где эта переменная конфигурации передается и проверяется. Подобная функциональность не существует в профиле / edit:
ProfileFormHandler->onSuccess.
поэтому вам нужно будет переопределить FOS ProfileFormHandler
и добавить эту функцию сами. Это покрыто в документация FOSUserBundle: переопределение форм.