Truy cập người dùng đã đăng nhập trong một mẫu


94

Tôi đang sử dụng FOSuserbundle để bắt đầu với Đăng ký người dùng https://github.com/FriendsOfSymfony/FOSUserBundle

Tôi đã đăng ký / đăng nhập và đăng xuất. Điều tôi muốn làm bây giờ là lấy dữ liệu người dùng đã đăng nhập và trình bày nó trên mọi trang trên trang web của tôi. Giống như "Xin chào tên người dùng" trong loại tiêu đề của điều.

Có vẻ như nhúng bộ điều khiển vào ứng dụng của tôi / Resources / views / base.html.twig là cách tốt nhất để thực hiện việc này http://symfony.com/doc/current/book/templating.html#embedding-controllers

Vì vậy, tôi đã viết bộ điều khiển của mình để truy cập dữ liệu hồ sơ người dùng. Những gì tôi không thể tìm ra là làm thế nào để truy cập các phương thức FOS trong bộ điều khiển nhúng của tôi. Vì vậy, từ Acme / UserBundle / Controller / UserController.php của tôi, tôi muốn làm điều này:

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));
}

mà tôi lấy từ: nhà cung cấp / gói / FOS / Nhóm người dùng / Bộ điều khiển / Hồ sơController.php

Câu trả lời:


229

Bạn có thể truy cập dữ liệu người dùng trực tiếp trong mẫu cành cây mà không yêu cầu bất kỳ thứ gì trong bộ điều khiển. Người dùng có thể truy cập như thế: app.user.

Bây giờ, bạn có thể truy cập mọi thuộc tính của người dùng. Ví dụ, bạn có thể truy cập vào tên người dùng như thế: app.user.username.

Cảnh báo, nếu người dùng chưa đăng nhập, app.usergiá trị là rỗng.

Nếu bạn muốn kiểm tra xem người dùng đã đăng nhập hay chưa, bạn có thể sử dụng is_grantedchức năng twig. Ví dụ, nếu bạn muốn kiểm tra xem người dùng có hay không ROLE_ADMIN, bạn chỉ cần làm is_granted("ROLE_ADMIN").

Vì vậy, trong mọi trang của bạn, bạn có thể làm:

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

8
cảm ơn. Tôi thực sự đã thay đổi "ROLE" cho "IS_AUTHENTICATED_REMEMBERED" và nó hoạt động tốt.
ed209, 27/09/11

5
Tôi không sử dụng FOSuserbundle (trừ khi nó bây giờ đi kèm) nhưng app.user.usernamevẫn làm việc cho tôi. Có thể hữu ích cho ai đó biết.
Jason Swett

1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables không phải là một phần của FOSUserBundle đó là lý do này luôn luôn làm việc (nghĩa của nơi Globals cành lá được định nghĩa trong 2.5) (đối với Jason Swett 30' tháng 3)
DerStoffel

16

Đối với symfony 2.6 trở lên, chúng ta có thể sử dụng

{{ app.user.getFirstname() }}

như biến toàn cục app.security cho mẫu Twig đã không được dùng nữa và sẽ bị xóa khỏi 3.0

thêm thông tin:

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

và xem các biến toàn cục trong

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


4
cuộc gọi phương thức không cần thiết. Bạn có thể sử dụng các thuộc tính động như thế này {{ app.user.firstname }}. Tôi đoán nó thân thiện với front-end-dev hơn.
kacper3w

2
Mặc dù tôi đồng ý với những nhận xét trên về việc không cần thiết, tôi sẽ upvote này vì nó chứng minh rằng phương pháp tùy chỉnh có thể được sử dụng nếu muốn
Simon

-1
{{ ứng dụng . người dùng . tên người dùng | default ( '' ) }} 

Ví dụ, chỉ cần xuất trình tên người dùng đăng nhập, mặc định chức năng lọc ('') sẽ tốt khi người dùng KHÔNG đăng nhập bởi chỉ tránh thông báo lỗi khó chịu.


2
và nó giải quyết vấn đề như thế nào? Có lẽ bạn cần phải thêm lời giải thích
Balwinder Singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.