2013-05-18 12 views
6

में संग्रहीत उपयोगकर्ता वरीयताओं के आधार पर लोकेल सेट करें मैं वर्तमान उपयोगकर्ता की वरीयताओं के आधार पर लोकेल सेट करने की कोशिश कर रहा हूं जो डीबी में संग्रहीत हैं।symfony 2 सेट लोकेल डीबी

इसलिए हमारे उपयोगकर्ता वर्ग को एक प्राप्त किया गया हैप्रभाली भाषा जो लोकेल पहचान ('en', 'fr_FR', आदि) लौटाती है।

  • "स्थानिकी" श्रोता सेवा है कि KernelEvents :: अनुरोध घटना का सदस्य बनता रजिस्टर:

    मैं निम्नलिखित दृष्टिकोण पर विचार किया है।

  • इस सेवा के पास सुरक्षा संदर्भ (इसके निर्माता के माध्यम से)
  • इस सेवा की ऑन कर्नेलरक्वेट विधि उपयोगकर्ता को सुरक्षा संदर्भ से प्राप्त करने का प्रयास करती है, उपयोगकर्ता के पसंदीदा लोकेल को प्राप्त करती है, और इसे अनुरोध के लोकेल के रूप में सेट करती है।

दुर्भाग्यवश, यह काम नहीं करता है। जब "लोकेल" श्रोता सेवा पर onequestEvent विधि लागू की जाती है, तो सुरक्षा संदर्भ में टोकन नहीं होता है। ऐसा लगता है कि संदर्भ श्रोता को बहुत देर से (0 की प्राथमिकता के साथ) पर बुलाया जाता है, और सुरक्षा संदर्भ से पहले मेरे "लोकेल" श्रोता को चलाने के लिए असंभव है।

क्या कोई इस दृष्टिकोण को ठीक करने का तरीका जानता है, या किसी अन्य का सुझाव देता है?

+0

मुझे अपनी समस्या के लिए एक अपूर्ण उत्तर मिला है, इसके लिए क्या योग्य है: कर्नेल इवेंट श्रोता में, मैं सत्र से सुरक्षा टोकन प्राप्त कर सकता हूं और इसे बेअसर कर सकता हूं, और इस प्रकार उपयोगकर्ता को प्राप्त कर सकता हूं। दुर्भाग्यवश, यह फ़ायरवॉल के लिए "contextKey" को जानने पर निर्भर करता है, जो कि बहुत कठिन कोड है। पूर्व में, अगर फ़ायरवॉल "मुख्य" है, तो टोकन सत्र से प्राप्त किया जा सकता है: $ टोकन = $ सत्र-> प्राप्त करें ('_ security_main'); यह तर्क ContextListener से उठाया गया है। लेकिन कॉन्फ़िगरेशन के दौरान संदर्भ श्रोता फ़ायरवॉल आईडी पारित हो जाता है। – user1447137

+0

क्या आपने इसके बजाय security_context इंजेक्ट करने का प्रयास किया है? फिर आप संदर्भ से टोकन और उपयोगकर्ता को प्राप्त कर सकते हैं। –

+0

पाजी, सुरक्षा संदर्भ इंजेक्शन करने से काम नहीं करता है। यह इस टिकट का पूरा बिंदु है। – user1447137

उत्तर

2

आप स्थान श्रोता, जो मैं इस जवाब में पोस्ट में रुचि हो सकती: Symfony2 locale detection: not considering _locale in session

संपादित करें: एक उपयोगकर्ता प्रोफ़ाइल में उनकी भाषा बदल जाती है, तो यह कोई समस्या नहीं है। यदि आप FOSUserBundle (मास्टर) का उपयोग कर रहे हैं तो आप प्रोफ़ाइल संपादित सफलता कार्यक्रम में हुक कर सकते हैं। अन्यथा आपके प्रोफाइल नियंत्रक में, यदि आप स्वयं निर्मित सिस्टम का उपयोग कर रहे हैं। यहाँ FOSUserBundle के लिए एक उदाहरण है:

<?php 
namespace Acme\UserBundle\EventListener; 
use FOS\UserBundle\Event\FormEvent; 
use FOS\UserBundle\FOSUserEvents; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 

class ChangeLanguageListener implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(
       FOSUserEvents::PROFILE_EDIT_SUCCESS => 'onProfileEditSuccess', 
     ); 
    } 

    public function onProfileEditSuccess(FormEvent $event) 
    { 
     $request = $event->getRequest(); 
     $session = $request->getSession(); 
     $form = $event->getForm(); 
     $user = $form->getData(); 
     $lang = $user->getLanguage(); 

     $session->set('_locale', $lang); 
     $request->setLocale($lang); 
    } 
} 

और services.yml

services: 
    acme.change_language: 
     class: Acme\UserBundle\EventListener\ChangeLanguageListener 
     tags: 
      - { name: kernel.event_subscriber } 
एकाधिक ब्राउज़र में अनेक सत्र के लिए

में, कोई समस्या नहीं है के रूप में हर नया सत्र एक नया प्रवेश की आवश्यकता है। हम्म, ठीक है, भाषा बदलने के बाद नहीं, क्योंकि केवल वर्तमान सत्र अपडेट किया जाएगा। लेकिन आप इसका समर्थन करने के लिए भाषासूची को संशोधित कर सकते हैं।
और यदि कोई व्यवस्थापक भाषा बदलता है तो मामला महत्वहीन होना चाहिए।

+0

मैं उत्तर की सराहना करता हूं, जो कि कुछ हद तक सहायक है। मैंने शुरुआती दृष्टिकोण पर विचार किया था, लेकिन कई उपयोग-मामलों को समर्थित होने के लिए और भी तर्क की आवश्यकता होगी, जैसे: उपयोगकर्ता लॉग इन करते समय पसंदीदा भाषा बदल रहा है (सत्र को अपडेट करने की आवश्यकता होगी), एकाधिक सत्र (उदा।उपयोगकर्ता कई ब्राउज़रों के माध्यम से लॉग इन), और उपयोगकर्ता पसंदीदा भाषा सीधे डीबी में बदल गई (उदाहरण के लिए व्यवस्थापक पृष्ठ के माध्यम से)। इससे मुझे आश्चर्य होता है कि समस्या का अधिक सरल जवाब नहीं है। – user1447137

+0

कृपया मेरा संपादन देखें। –

+0

हां, यह काम करेगा, और यह निश्चित रूप से एक बेहतर समाधान है कि मैं किसके साथ आया हूं, लेकिन इसमें बहुत से चलने वाले हिस्सों को शामिल किया गया है। मेरे ऐप की साधारण परिस्थितियों के कारण, मैं अपने स्वीकार्य रूप से उप-इष्टतम समाधान के साथ जाऊंगा (क्योंकि मैं केवल 1 फ़ायरवॉल से निपटता हूं, मैं बस अपने श्रोता में अपनी आईडी इंजेक्ट कर सकता हूं और सत्र से सुरक्षा टोकन पुनर्प्राप्त करने के लिए इसका उपयोग कर सकता हूं) । बहुत धन्यवाद। – user1447137

संबंधित मुद्दे