Acceder al usuario que inició sesión en una plantilla

94

Estoy usando FOSuserbundle para comenzar con el registro de usuario https://github.com/FriendsOfSymfony/FOSUserBundle

Lo tengo registrándome / entrando y saliendo. Lo que quiero hacer ahora es tomar los datos de los usuarios registrados y presentarlos en cada página de mi sitio. Como "Hola nombre de usuario" en el tipo de encabezado.

Parece que incrustar un controlador en mi aplicación / Resources / views / base.html.twig es la mejor manera de hacer esto http://symfony.com/doc/current/book/templating.html#embedding-controllers

Entonces escribí mi controlador para acceder a los datos del perfil de usuario. Lo que no puedo entender es cómo acceder a los métodos FOS en mi controlador integrado. Entonces, desde mi Acme / UserBundle / Controller / UserController.php quiero hacer esto:

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 tomé de: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

ed209
fuente

Respuestas:

229

Puede acceder a los datos del usuario directamente en la plantilla twig sin solicitar nada en el controlador. El usuario es accesible así: app.user.

Ahora, puede acceder a todas las propiedades del usuario. Por ejemplo, se puede acceder al nombre de usuario de esa manera: app.user.username.

Advertencia, si el usuario no está registrado, el app.user es nulo.

Si desea verificar si el usuario está registrado, puede usar la is_grantedfunción twig. Por ejemplo, si quieres comprobar si el usuario tiene ROLE_ADMIN, solo tienes que hacerlo is_granted("ROLE_ADMIN").

Entonces, en cada una de sus páginas puede hacer:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
Egeloen
fuente
8
Gracias. De hecho, cambié "ROLE" por "IS_AUTHENTICATED_REMEMBERED" y funcionó muy bien.
ed209
5
No estoy usando FOSuserbundle (a menos que ahora venga con él) pero app.user.usernameaún me funcionó. Podría ser útil que alguien lo sepa.
Jason Swett
1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables no es parte de FOSUserBundle, por lo que esto siempre funciona (ahí es donde se definen los twig Globals en 2.5) (con respecto a Jason Swett 30 de marzo)
DerStoffel
16

Para Symfony 2.6 y superior podemos usar

{{ app.user.getFirstname() }}

como app.security la variable global para la plantilla Twig ha quedado obsoleta y se eliminará de 3.0

más información:

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

y ver las variables globales en

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

zubair Shaik
fuente
4
llamada de método innecesaria. Puede utilizar atributos dinámicos como este {{ app.user.firstname }}. Supongo que es más amigable con el desarrollador de aplicaciones para el usuario.
kacper3w
2
Aunque estoy de acuerdo con el comentario anterior sobre ser innecesario, voy a votar a favor de esto porque demuestra que se pueden usar métodos personalizados si se desea
Simon
-1
{{ aplicación . usuario . nombre de usuario | predeterminado ( '' ) }} 

Simplemente presente el nombre de usuario de inicio de sesión, por ejemplo, la función de filtro predeterminada ('') debería ser agradable cuando el usuario NO inicia sesión solo para evitar el molesto mensaje de error.

Wei Zhang
fuente
2
y ¿cómo resuelve el problema? Quizás necesite agregar una explicación
Balwinder Singh