Mengakses pengguna yang masuk di templat

94

Saya menggunakan FOSuserbundle untuk memulai dengan pendaftaran Pengguna https://github.com/FriendsOfSymfony/FOSUserBundle

Saya sudah mendaftar / masuk dan keluar. Yang ingin saya lakukan sekarang adalah mengambil data pengguna yang masuk dan menyajikannya di setiap halaman situs saya. Seperti "Hai nama pengguna" di jenis header.

Sepertinya menyematkan pengontrol di app / Resources / views / base.html.twig saya adalah cara terbaik untuk melakukan ini http://symfony.com/doc/current/book/templating.html#embedding-controllers

Jadi saya menulis pengontrol saya untuk mengakses data profil pengguna. Apa yang tidak saya ketahui adalah cara mengakses metode FOS di pengontrol tertanam saya. Jadi dari Acme / UserBundle / Controller / UserController.php saya, saya ingin melakukan ini:

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

yang saya ambil dari: vendor / bundles / FOS / UserBundle / Controller / ProfileController.php

ed209
sumber

Jawaban:

229

Anda dapat mengakses data pengguna secara langsung di templat ranting tanpa meminta apa pun di pengontrol. Pengguna dapat diakses seperti itu: app.user.

Sekarang, Anda dapat mengakses setiap properti pengguna. Misalnya, Anda dapat mengakses username seperti itu: app.user.username.

Peringatan, jika pengguna tidak login, app.useradalah null.

Jika Anda ingin memeriksa apakah pengguna sudah masuk, Anda dapat menggunakan is_grantedfungsi ranting. Misalnya, jika Anda ingin memeriksa apakah pengguna memiliki ROLE_ADMIN, Anda hanya perlu melakukannya is_granted("ROLE_ADMIN").

Jadi, di setiap halaman Anda, Anda dapat melakukan:

{% if is_granted("ROLE") %}
    Hi {{ app.user.username }}
{% endif %}
egeloen
sumber
8
Terima kasih. Sebenarnya saya mengubah "ROLE" untuk "IS_AUTHENTICATED_REMEMBERED" dan berfungsi dengan baik.
ed209
5
Saya tidak menggunakan FOSuserbundle (kecuali sekarang sudah disertakan) tetapi app.user.usernamemasih berfungsi untuk saya. Mungkin berguna untuk diketahui seseorang.
Jason Swett
1
Symfony \ Bundle \ FrameworkBundle \ Templating \ GlobalVariables bukan bagian dari FOSUserBundle, itulah sebabnya ini selalu berfungsi (di situlah ranting Globals didefinisikan di 2.5) (berkaitan dengan Jason Swett 30 Maret ')
DerStoffel
16

Untuk symfony 2.6 ke atas kita bisa menggunakan

{{ app.user.getFirstname() }}

karena variabel global app.security untuk template Twig tidak digunakan lagi dan akan dihapus dari 3.0

Info lebih lanjut:

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

dan melihat variabel global di

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

zubair Shaik
sumber
4
pemanggilan metode yang tidak perlu. Anda dapat menggunakan atribut dinamis seperti ini {{ app.user.firstname }}. Kurasa ini lebih ramah pengembang front-end.
kacper3w
2
Meskipun saya setuju dengan komentar di atas tentang tidak perlu, saya akan meningkatkannya karena ini menunjukkan bahwa metode khusus dapat digunakan jika diinginkan
Simon
-1
{{ aplikasi . pengguna . nama pengguna | default ( '' ) }} 

Cukup tunjukkan nama pengguna login misalnya, fungsi filter default ('') seharusnya bagus ketika pengguna TIDAK login hanya dengan menghindari pesan error yang mengganggu.

Wei Zhang
sumber
2
dan bagaimana cara menyelesaikan masalah? Mungkin Anda perlu menambahkan penjelasan
Balwinder Singh