2012-12-20 38 views
6

का उपयोग करके कभी भी ट्रिगर नहीं किया गया है, मैं एक सिम्फनी 2 लॉगिन ईवेंट श्रोता जोड़ने की कोशिश कर रहा हूं, लक्ष्य प्रत्येक डेटाबेस पर लॉग इन होने पर डेटाबेस से संग्रहीत लोकेल सेट करना है, और प्रत्येक अनुरोध पर किसी डिफ़ॉल्ट में फ़ॉलबैक कोई उपयोगकर्ता लॉग नहीं है। मैं FOSUserBundle का उपयोग करता हूं, और मैं security.interactive_login ईवेंट को काम करने की कोशिश कर रहा हूं।Symfony2 लॉगिन ईवेंट श्रोता और security.interactive_login ईवेंट FOSUser

my_user.security.interactive_login_listener: 
     class: My\UserBundle\EventListener\UserListener 
     arguments: [@security.context, @doctrine] 
     tags: 
      - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser } 

my_user.security.kernel_request_listener: 
     class: My\UserBundle\EventListener\UserListener 
     arguments: [@security.context, @doctrine] 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: setLocaleForUnauthenticatedUser } 

समस्या है, security.interactive_login घटना: http://dev.dbl-a.com/symfony-2-0/how-to-add-a-symfony2-login-event-listener/

मैं FOSUserBundle की अपने ही बच्चे को बंडल और services.yml में इस कार्यान्वयन है: मैं इस तरह इंटरनेट पर कोड का एक बहुत कुछ मिल लॉग इन होने पर भी लॉग इन होने पर भी ट्रिगर नहीं किया जाता है। इसके विपरीत, मेरे setLocaleForUnauthenticatedUser हमेशा ट्रिगर किया जाता है। मुझे मिले हर कोड नमूने में काम करने लगता है, मेरे ऐप के साथ क्या गलत है?

+0

symfony2 की शाखा संस्करण और FOSUserBundle के संस्करण क्या है? – Rmannn

उत्तर

0

यहां एक ही समस्या है। लेकिन समस्या यह नहीं है कि घटना ट्रिगर नहीं हुई है। समस्या यह है कि पुनर्निर्देशन के बाद, अनुरोध लोकेल खो गया है। इस लिंक से मदद के साथ:

Changing locale with symfony 2.1

(और पर this आधारित)

मैं पता लगा कि यह कैसे हल करने के लिए। UserListener में:

class UserListener 
{ 
    private $session; 

    public function setSession($session) { 
     $this->session = $session; 
    }  

    public function setLocaleForUnauthenticatedUser(GetResponseEvent $event) 
    { 
     if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) { 
      return; 
     } 
     $request = $event->getRequest(); 
     if ('undefined' == $request->getLocale()) { 
      if($locale = $request->getSession()->get('_locale')) { 
       $request->setLocale($locale); 
      } else { 
       $request->setLocale($request->getPreferredLanguage()); 
      } 
     } 
    } 

    public function setLocaleForAuthenticatedUser(InteractiveLoginEvent $event) 
    { 
     $user = $event->getAuthenticationToken()->getUser(); 

     if ($locale = $user->getLocale()) { 
//   $event->getRequest()->setLocale($user->getLocale()); 
      $this->session->set('_locale', $locale); 
     } 
    } 
} 

services.yml में, आप घोषित करना चाहिए:

your_listener_name: 
    class: ...\UserBundle\EventListener\UserListener 
    calls: 
     - [ setSession, ['@session'] ] 
    tags: 
     - { name: kernel.event_listener, event: security.interactive_login, method: setLocaleForAuthenticatedUser } 

आशा इस मदद करता है।

1

भी पता लगाया गया है, और लगभग उतना ही कम काम किया है: वास्तव में कोई समस्या नहीं है, लेकिन लॉगिन के बाद कुछ प्रकार की पुनर्निर्देशन है, इसलिए प्रोफाइलर कभी भी वास्तविक अनुरोध नहीं दिखाता है जो इंटरैक्टिव लॉगिन श्रोता को ट्रिगर करता है।

use Symfony\Component\Security\Http\Event\InteractiveLoginEvent, 
    Symfony\Component\Security\Http\Event\FilterControllerEvent, 
    Symfony\Component\HttpKernel\Event\GetResponseEvent, 
    Symfony\Component\HttpKernel\HttpKernelInterface; 
use FOS\UserBundle\Entity\User as BaseUser; 

class LocaleListener { 

    protected $container; 
    protected $availableLocales; 

    public function __construct(\Symfony\Component\DependencyInjection\Container $container, $availableLocales) { 
     $this->container = $container; 
     $this->availableLocales = $availableLocales; 
    } 

    public function onKernelRequest(GetResponseEvent $event) { 
     $request = $event->getRequest(); 
     $locale = $request->getPreferredLanguage($this->availableLocales); 
     $session = $request->getSession(); 

     $token = $this->container->get('security.context')->getToken(); 
     if(is_object($token)) { 
      $user = $token->getUser(); 
      if ($user instanceof BaseUser) { 
       $locale = $user->getLocale(); 
      } 
     } 

     $session = $this->container->get('session'); 
     $session->set('_locale', $locale); 
     $request->setLocale($locale); 
    } 
} 

services.yml में:

user.locales.kernel_request_listener: 
     class: Acme\UserBundle\EventListener\LocaleListener 
     arguments: [ @service_container, [ 'en', 'fr', 'ru' ] ] 
     tags: [{ name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: -255 }]