การเข้าถึงผู้ใช้ที่เข้าสู่ระบบในเทมเพลต


94

ฉันใช้ FOSuserbundle เพื่อเริ่มการลงทะเบียนผู้ใช้https://github.com/FriendsOfSymfony/FOSUserBundle

ฉันได้รับการลงทะเบียน / เข้าสู่ระบบและออก สิ่งที่ฉันต้องการทำตอนนี้คือดึงข้อมูลผู้ใช้ที่ล็อกอินและนำเสนอในทุกหน้าของไซต์ของฉัน เช่น "สวัสดีชื่อผู้ใช้" ในประเภทส่วนหัวของสิ่งต่างๆ

ดูเหมือนว่าการฝังตัวควบคุมในแอป / Resources / views / base.html.twig ของฉันเป็นวิธีที่ดีที่สุดในการดำเนินการhttp://symfony.com/doc/current/book/templating.html#embedding-controllers

ฉันจึงเขียนคอนโทรลเลอร์เพื่อเข้าถึงข้อมูลโปรไฟล์ผู้ใช้ สิ่งที่ฉันคิดไม่ออกคือวิธีเข้าถึงวิธีการ FOS ในคอนโทรลเลอร์แบบฝังตัวของฉัน ดังนั้นจากAcme / UserBundle / Controller / 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));
}

ซึ่งฉันคว้ามาจาก: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

คำตอบ:


229

คุณสามารถเข้าถึงข้อมูลผู้ใช้โดยตรงในเทมเพลต twig โดยไม่ต้องร้องขออะไรจากคอนโทรลเลอร์ ผู้ใช้สามารถเข้าถึงได้เช่นนั้น: app.user.

ตอนนี้คุณสามารถเข้าถึงทุกคุณสมบัติของผู้ใช้ app.user.usernameตัวอย่างเช่นคุณสามารถเข้าถึงชื่อผู้ใช้เช่นว่า:

คำเตือนหากผู้ใช้ไม่ได้เข้าสู่ระบบแสดงว่าapp.userเป็นโมฆะ

หากคุณต้องการตรวจสอบว่าผู้ใช้ล็อกอินหรือไม่คุณสามารถใช้is_grantedฟังก์ชัน twig ได้ ตัวอย่างเช่นถ้าคุณต้องการที่จะตรวจสอบว่าผู้ใช้มีคุณเพียงแค่ต้องทำROLE_ADMINis_granted("ROLE_ADMIN")

ดังนั้นในทุกหน้าของคุณคุณสามารถทำได้:

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

8
ขอบคุณ. จริงๆแล้วฉันได้เปลี่ยน "ROLE" สำหรับ "IS_AUTHENTICATED_REMEMBERED" และได้ผลดี
ed209

5
ฉันไม่ได้ใช้ FOSuserbundle (เว้นแต่จะมาพร้อมกับ) แต่app.user.usernameก็ยังใช้ได้สำหรับฉัน อาจเป็นประโยชน์สำหรับใครบางคนที่ควรรู้
Jason Swett

1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables ไม่ได้เป็นส่วนหนึ่งของ FOSUserBundle ซึ่งเป็นเหตุผลว่าทำไมจึงใช้งานได้ตลอดเวลา (นั่นคือที่ที่ Twig Globals กำหนดไว้ใน 2.5) (เกี่ยวกับ Jason Swett 30 มีนาคม)
DerStoffel

16

สำหรับ symfony 2.6 ขึ้นไปเราสามารถใช้ได้

{{ app.user.getFirstname() }}

เนื่องจากapp.security global variable สำหรับ Twig template ถูกเลิกใช้แล้วและจะถูกลบออกจาก 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 }}คุณสามารถใช้แอตทริบิวต์แบบไดนามิกเช่นนี้ ฉันเดาว่าเป็น front-end-dev-friendly มากกว่า
kacper3w

2
แม้ว่าฉันจะเห็นด้วยกับความคิดเห็นข้างต้นเกี่ยวกับการไม่จำเป็น แต่ฉันจะเพิ่มคะแนนให้เพราะมันแสดงให้เห็นว่าสามารถใช้วิธีการที่กำหนดเองได้หากต้องการ
Simon

-1
{{app.user.username | default ('')}}

เพียงแค่แสดงชื่อผู้ใช้เข้าสู่ระบบตัวอย่างเช่นค่าเริ่มต้นของฟังก์ชันตัวกรอง ('') จะดีเมื่อผู้ใช้ไม่ได้เข้าสู่ระบบโดยเพียงแค่หลีกเลี่ยงข้อความแสดงข้อผิดพลาดที่น่ารำคาญ


2
และจะแก้ไขปัญหาได้อย่างไร บางทีคุณอาจต้องเพิ่มคำอธิบาย
Balwinder Singh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.