Как внедрить глобальные переменные во все шаблоны? - PullRequest
2 голосов
/ 01 мая 2019

В моем шаблоне веточки есть некоторые переменные, которые требуются на каждой странице, такие как userName, userId или userImage.

Каков наилучший способ вставить их в шаблон?

Я уже читал статью Как вставить переменные во все шаблоны , но как я могу записать переменную (например, текущего пользователя) в файл config/packages/twig.php?

Прямо сейчас тамтакой код есть в каждом контроллере:

return $this->render('admin/users/index.html.twig', [
   "allUsers" => $allUsers,
   "pageTitle" => "Benutzerübersicht",
   "userName" => "Max Mustermann",
   "userId" => 5,
   "userImage" => "http://i.pravatar.cc/150?img=6"
]);

(Это только примерные значения, так как я еще не интегрировал аутентификацию, но хотел создать свой шаблон)

Есть ли лучший способчем вводить каждую переменную в каждом контроллере?

Ответы [ 2 ]

5 голосов
/ 01 мая 2019

У вас есть несколько опций, в зависимости от того, что именно вам нужно:

Вы можете внедрить это как глобальные переменные Twig, используя Event Listener.

  1. Создать класс слушателя:
namespace App\Listener;
// src/EventListener/ControllerListener.php

use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Security\Core\Security;
use Twig\Environment;

class ControllerListener {
    /**
     * @var \Twig\Environment
     */
    private $twig;
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    private $manager;
    /**
     * @var \Symfony\Component\Security\Core\Security
     */
    private $security;

    public function __construct( Environment $twig, EntityManager $manager, Security $security ) {
        $this->twig     = $twig;
        $this->manager  = $manager;
        $this->security = $security;
    }

    public function onKernelController( FilterControllerEvent $event ): void {
        $results = $this->manager->getRepository( 'SomeClass' )->findBy( [ 'some' => 'criteria' ] );
        $user    = $this->security->getUser();
        $this->twig->addGlobal( 'veryGlobal', $results[0]->getName() );
        $this->twig->addGlobal( 'username', $user->getUsername() );
    }
}

Я ввожу:

  • Twig, чтобы вы могли добавить туда глобальные переменные.
  • Entity Manager, чтобы вы могли запроситьБД, если вам нужно получить информацию оттуда
  • Безопасность, чтобы получить информацию от пользователя.

  • После того, как это будет создано, вам нужно добавить следующие строки конфигурации:
# config/services.yaml
services:
    App\EventListener\ControllerListener:
        tags:
            - { name: kernel.event_listener, event: kernel.controller }

, что позволит обработчику событий запускаться при каждом запросе.

Использование конфигурации веток для внедрения глобальной службы:

С помощью этих строк конфигурации, как описано в документации , вы указываете ветке внедрять определенную службу:

# config/packages/twig.yaml
twig:
    # ...
    globals:
        # the value is the service's id
        users: '@App\Service\UserManagement'

Тогда это так же просто, как создать App\Service\UserManagement:

namespace App\Service:

class UserManagement {

   public function __construct() {
      // use the constructor to inject your dependencies, as usual
   }

   public function getOldestUser() {
      // do your thing
      return $oldestUserName;
   }
}

Тогда из ветки вы можете сделать:

{{ users.oldestUser }}

Наконец, если вас интересует толькоданные пользователя вошедшего в систему

Как уже упоминалось, если вас интересуют только данные, принадлежащие вошедшему в систему пользователю, вы можете просто получить к ним доступ через переменную приложения, которая вводится при каждом запросе .

Представление текущего пользователя или ноль, если его нет.Значением, хранящимся в этой переменной, может быть объект UserInterface, любой другой объект, который реализует метод __toString (), или даже обычная строка.

Например:

{{ app.user.userName }}
2 голосов
/ 01 мая 2019

Реализуете ли вы UserInterface? Если это так, вы можете использовать app.user, как описано в https://symfony.com/doc/current/templating/app_variable.html

например. в ваших шаблонах вы можете использовать {{ app.user.userName }} для отображения текущего имени пользователя вошедшего в систему пользователя.

...