नए FOSUserBundle की घटनाओं (FOS 2.0 सुविधा) का उपयोग करके, आप ChangeProfileListener
बना सकते हैं जो ईमेल परिवर्तनों को संभालता है।
विचार: पंजीकरण प्रक्रिया के रूप में एक ही तर्क का उपयोग करें: हमारे उपयोगकर्ता को अक्षम करें, उसे एक टोकन भेजें (और हमारे मामले के लिए उसे लॉग आउट करें)।
- एक घटना
- suscriber 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));
}
}
}
services.yml:
ईमेल टेम्पलेट overwritting बारे
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 बनाने है। टहनी और शब्दों में कहें, उदाहरण के लिए:
{% 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 %}
यह समाधान हालांकि एक समस्या है करता है, उपयोगकर्ता उन्हें बदल जाता है जब एआईएल डीबी अद्यतन किया गया है। अगर ईमेल गलत है तो वे सिस्टम में वापस कैसे आते हैं? क्या नए ईमेल को एक अलग क्षेत्र में स्टोर करना बेहतर नहीं होगा? – lookbadgers