2012-04-03 7 views
13

मैं 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: [email protected]%domain% 
    sender_name: %site_name% Staff 
    resetting: 
    token_ttl: %reset_password_ttl% 

कोई मेरी मदद कर सकता है?

उत्तर

17

नए 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 %} 
+1

यह समाधान हालांकि एक समस्या है करता है, उपयोगकर्ता उन्हें बदल जाता है जब एआईएल डीबी अद्यतन किया गया है। अगर ईमेल गलत है तो वे सिस्टम में वापस कैसे आते हैं? क्या नए ईमेल को एक अलग क्षेत्र में स्टोर करना बेहतर नहीं होगा? – lookbadgers

4

कार्यक्षमता भेजने के लिए एक पुष्टिकरण ईमेल केवल

RegistrationFormHandler->onSucces 

में मौजूद है जहां कि विन्यास चर पारित कर दिया और चेक किया गया है। इसी तरह की सुविधा प्रोफ़ाइल/संपादन में मौजूद नहीं है:

ProfileFormHandler->onSuccess. 

इसलिए FOS ProfileFormHandler ओवरराइड और अपने आप को इस कार्यक्षमता जोड़ने के लिए की आवश्यकता होगी। यह FOSUserBundle documentation: Overriding Forms में शामिल है।