टेम्पलेट में लॉग-इन उपयोगकर्ता तक पहुँचना


94

मैं उपयोगकर्ता पंजीकरण https://github.com/FriendsOfSymfony/FOSUserBundle के साथ आरंभ करने के लिए FOSuserbundle का उपयोग कर रहा हूं

मुझे इसमें पंजीकरण और लॉग इन / आउट करना पड़ा है। अब मैं जो करना चाहता हूं वह लॉग इन यूजर्स के डेटा को हड़प लेता है और अपनी साइट के हर पेज पर प्रस्तुत करता है। हेडर प्रकार में "हाय यूज़रनेम" की तरह।

ऐसा लगता है कि मेरे ऐप / रिसोर्स / व्यूज़ / base.html.twig में किसी कंट्रोलर को एम्बेड करना यह http://symfony.com/doc/current/book/templating.html#embedding-controllers करने का सबसे अच्छा तरीका है

इसलिए मैंने उपयोगकर्ता प्रोफ़ाइल डेटा तक पहुंचने के लिए अपने नियंत्रक को लिखा। मैं समझ नहीं पा रहा हूं कि अपने एम्बेडेड नियंत्रक में FOS विधियों का उपयोग कैसे किया जाए। तो मेरे Acme / UserBundle / नियंत्रक / UserController.php से मैं यह करना चाहता हूं:

public function showAction()
{
    $user = $this->container->get('security.context')->getToken()->getUser();
    if (!is_object($user) || !$user instanceof UserInterface) {
        throw new AccessDeniedException(
               'This user does not have access to this section.');
    }

    return $this->container->get('templating')
      ->renderResponse('FOSUserBundle:Profile:show.html.'.$this->container
      ->getParameter('fos_user.template.engine'), array('user' => $user));
}

जिसे मैंने से पकड़ा: विक्रेता / बंडलों / FOS / UserBundle / नियंत्रक / ProfileController.php

जवाबों:


229

आप नियंत्रक में कुछ भी अनुरोध किए बिना सीधे उपयोगकर्ता को टहनी टेम्पलेट में एक्सेस कर सकते हैं। उपयोगकर्ता इस तरह सुलभ है app.user:।

अब, आप उपयोगकर्ता की प्रत्येक संपत्ति तक पहुँच सकते हैं। उदाहरण के लिए, आप इस तरह उपयोगकर्ता नाम का उपयोग कर सकते हैं app.user.username:।

चेतावनी, यदि उपयोगकर्ता लॉग नहीं है, तो app.userअशक्त है।

यदि आप जांचना चाहते हैं कि उपयोगकर्ता लॉग इन है या नहीं, तो आप is_grantedट्विग फ़ंक्शन का उपयोग कर सकते हैं । उदाहरण के लिए, यदि आप जांचना चाहते हैं कि उपयोगकर्ता के पास है ROLE_ADMIN, तो आपको बस करना होगा is_granted("ROLE_ADMIN")

इसलिए, अपने प्रत्येक पृष्ठ में आप यह कर सकते हैं:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}

8
धन्यवाद। मैंने वास्तव में "IS_AUTHENTICATED_REMEMBERED" के लिए "रोल" बदल दिया और इसने बहुत अच्छा काम किया।
ed209

5
मैं FOSuserbundle का उपयोग नहीं कर रहा हूं (जब तक कि अब यह साथ नहीं आता) लेकिन फिर app.user.usernameभी मेरे लिए काम किया। किसी के लिए जानना उपयोगी हो सकता है।
जेसन स्वेट

1
सिम्फनी \ बंडल \ फ्रेमवर्कबंडले \ टेंपलेटिंग \ ग्लोबलवेरिअल्स FOSUserBundle का हिस्सा नहीं है, यही वजह है कि यह हमेशा काम करता है (जहां टहनी ग्लोबल्स 2.5 में परिभाषित किया गया है) (जेसन
जेट

16

सिम्फनी 2.6 और इसके बाद के संस्करण के लिए हम उपयोग कर सकते हैं

{{ app.user.getFirstname() }}

Twig टेम्पलेट के लिए app.security वैश्विक चर के रूप में हटा दिया गया है और 3.0 से हटा दिया जाएगा

और जानकारी:

http://symfony.com/blog/new-in-symfony-2-6-security-component-improvements

और में वैश्विक चर देखें

http://symfony.com/doc/current/reference/twig_reference.html


4
अनावश्यक विधि कॉल। आप इस तरह गतिशील विशेषताओं का उपयोग कर सकते हैं {{ app.user.firstname }}। मुझे लगता है कि यह अधिक फ्रंट-एंड-देव-फ्रेंडली है।
kacper3w

2
भले ही मैं अनावश्यक टिप्पणी के बारे में ऊपर की टिप्पणी से सहमत हूं, मैं इसे आगे बढ़ाने जा रहा हूं क्योंकि यह दर्शाता है कि कस्टम तरीकों का उपयोग किया जा सकता है यदि वांछित हो
साइमन

-1
{{ ऐप उपयोगकर्ता उपयोगकर्ता नाम | डिफ़ॉल्ट ( '' ) }} 

उदाहरण के लिए बस लॉगिन उपयोगकर्ता नाम प्रस्तुत करें, फ़िल्टर फ़ंक्शन डिफ़ॉल्ट ('') अच्छा होना चाहिए जब उपयोगकर्ता केवल कष्टप्रद त्रुटि संदेश से बचने के लिए लॉगिन नहीं है।


2
और यह समस्या का समाधान कैसे करता है? शायद आपको स्पष्टीकरण जोड़ने की ज़रूरत है
बलविंदर सिंह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.