Zugriff auf den angemeldeten Benutzer in einer Vorlage

94

Ich verwende FOSuserbundle, um mit der Benutzerregistrierung https://github.com/FriendsOfSymfony/FOSUserBundle zu beginnen

Ich habe es registriert / ein- und abmelden. Was ich jetzt tun möchte, ist, die angemeldeten Benutzerdaten zu erfassen und auf jeder Seite meiner Website zu präsentieren. Wie "Hallo Benutzername" in der Kopfzeile.

Es scheint wie ein Controller in meiner Einbettung app / Resources / Ansichten / base.html.twig ist der beste Weg , dies zu tun http://symfony.com/doc/current/book/templating.html#embedding-controllers

Also habe ich meinen Controller geschrieben, um auf die Benutzerprofildaten zuzugreifen. Was ich nicht herausfinden kann, ist, wie ich auf FOS-Methoden in meinem eingebetteten Controller zugreifen kann. Von meiner Acme / UserBundle / Controller / UserController.php aus möchte ich Folgendes tun:

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

was ich von genommen habe: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

ed209
quelle

Antworten:

229

Sie können direkt in der Zweigvorlage auf Benutzerdaten zugreifen, ohne etwas in der Steuerung anzufordern. Der Benutzer ist folgendermaßen erreichbar : app.user.

Jetzt können Sie auf jede Eigenschaft des Benutzers zugreifen. So können Sie beispielsweise auf den Benutzernamen zugreifen : app.user.username.

Warnung: Wenn der Benutzer nicht angemeldet ist, app.userist der Wert null.

Wenn Sie überprüfen möchten, ob der Benutzer angemeldet ist, können Sie die is_grantedZweigfunktion verwenden. Wenn Sie beispielsweise überprüfen möchten, ob der Benutzer ROLE_ADMINdies getan hat , müssen Sie dies nur tun is_granted("ROLE_ADMIN").

Auf jeder Ihrer Seiten können Sie also Folgendes tun:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
egeloen
quelle
8
Vielen Dank. Ich habe "ROLE" für "IS_AUTHENTICATED_REMEMBERED" geändert und es hat großartig funktioniert.
ed209
5
Ich verwende FOSuserbundle nicht (es sei denn, es wird jetzt mitgeliefert), habe aber app.user.usernametrotzdem für mich gearbeitet. Könnte für jemanden nützlich sein, um es zu wissen.
Jason Swett
1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables ist nicht Teil des FOSUserBundle, weshalb dies immer funktioniert (dort sind die Zweigglobale in 2.5 definiert) (in Bezug auf Jason Swett 30. März ')
DerStoffel
16

Für Symfony 2.6 und höher können wir verwenden

{{ app.user.getFirstname() }}

als app.security globale Variable für Twig-Vorlage ist veraltet und wird aus 3.0 entfernt

Mehr Info:

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

und sehen Sie die globalen Variablen in

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

zubair Shaik
quelle
4
unnötiger Methodenaufruf. Sie können solche dynamischen Attribute verwenden {{ app.user.firstname }}. Es ist eher Front-End-Entwickler-freundlich, denke ich.
Kacper3w
2
Obwohl ich dem obigen Kommentar über die Unnötigkeit zustimme, werde ich dies positiv bewerten, da es zeigt, dass benutzerdefinierte Methoden verwendet werden können, wenn dies gewünscht wird
Simon
-1
{{ App . Benutzer . Benutzername | Standard ( '' ) }} 

Geben Sie beispielsweise nur den Benutzernamen für die Anmeldung an. Die Standardeinstellung für die Filterfunktion ('') sollte hilfreich sein, wenn sich der Benutzer NICHT anmeldet, indem Sie nur lästige Fehlermeldungen vermeiden.

Wei Zhang
quelle
2
und wie löst es das Problem? Vielleicht müssen Sie eine Erklärung hinzufügen
Balwinder Singh