Acessando o usuário conectado em um modelo

94

Estou usando o FOSuserbundle para começar a registrar o usuário https://github.com/FriendsOfSymfony/FOSUserBundle

Eu tenho que registrar / fazer login e logout. O que eu quero fazer agora é pegar os dados dos usuários conectados e apresentá-los em todas as páginas do meu site. Como "Olá, nome de usuário" no tipo de cabeçalho.

Parece que incorporar um controlador em meu app / Resources / views / base.html.twig é a melhor maneira de fazer isso http://symfony.com/doc/current/book/templating.html#embedding-controllers

Então, escrevi meu controlador para acessar os dados do perfil do usuário. O que não consigo descobrir é como acessar os métodos FOS em meu controlador embarcado. Então, em meu Acme / UserBundle / Controller / UserController.php, eu quero fazer isso:

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

que peguei de: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

ed209
fonte

Respostas:

229

Você pode acessar os dados do usuário diretamente no modelo do twig sem solicitar nada no controlador. O usuário é acessível assim: app.user.

Agora, você pode acessar todas as propriedades do usuário. Por exemplo, você pode acessar o nome de usuário assim: app.user.username.

Aviso, se o usuário não estiver logado, o app.useré nulo.

Se você quiser verificar se o usuário está logado, você pode usar a is_grantedfunção twig. Por exemplo, se você quiser verificar se o usuário tem ROLE_ADMIN, basta fazer is_granted("ROLE_ADMIN").

Portanto, em cada uma de suas páginas, você pode fazer:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
Egeloen
fonte
8
obrigado. Na verdade, mudei "ROLE" por "IS_AUTHENTICATED_REMEMBERED" e funcionou muito bem.
ed209
5
Não estou usando o FOSuserbundle (a menos que agora venha com), mas app.user.usernameainda funcionou para mim. Pode ser útil para alguém saber.
Jason Swett
1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables não faz parte do FOSUserBundle e é por isso que funciona sempre (é aí que os galhos Globais são definidos em 2.5) (em relação a Jason Swett 30 de março ')
DerStoffel
16

Para symfony 2.6 e superior, podemos usar

{{ app.user.getFirstname() }}

como a variável global app.security para o modelo Twig foi descontinuado e será removido do 3.0

mais informações:

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

e ver as variáveis ​​globais em

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

zubair Shaik
fonte
4
chamada de método desnecessária. Você pode usar atributos dinâmicos como este {{ app.user.firstname }}. Acho que é mais amigável com o desenvolvedor.
kacper3w
2
Embora eu concorde com o comentário acima sobre ser desnecessário, irei votar a favor porque ele demonstra que métodos personalizados podem ser usados ​​se desejado
Simon
-1
{{app.user.username | default ('')}}app . usuário . nome de usuário | padrão ( '' ) }} 

Apenas apresente o nome de usuário de login, por exemplo, a função de filtro padrão ('') deve ser bom quando o usuário NÃO fizer o login, apenas para evitar mensagens de erro irritantes.

Wei Zhang
fonte
2
e como isso resolve o problema? Talvez você precise adicionar uma explicação
Balwinder Singh