Как сделать переменные сеанса доступными как глобалы Twig? - PullRequest
0 голосов
/ 13 февраля 2020

В представлении ветки можно получить переменную сеанса с

{% set myVar=app.session.get('myVar') %}

Это удобно, но мне нужно делать это каждый раз, когда я использую представление, которое не расширяет базовый шаблон.

Вместо этого я хотел бы установить эти переменные сеанса как глобальные переменные.

Я пытался использовать @session в config/packages/twig.yaml, под globals, но рядом с @session.storage я могу Не могу найти никаких методов для доступа к моим переменным.

Я думал о том, чтобы сделать это в моем kernelListener событии, но я не знаю, какой сервис импортировать, чтобы добавить некоторые глобальные динамические ветки (если это возможно) .

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Пользовательское расширение - это путь к go. Описательный, легко тестируемый. Нет необходимости вызывать прослушиватель событий, когда не используется Twig.

Мое решение использует ленивое расширение Twig , которое доступно начиная с Twig 1.35 и 2.4.4

Оба будут автоматически подключаться и автоматически настраиваться:

final class SessionRuntime implements RuntimeExtensionInterface
{
    private $session;

    public function __construct(SessionInterface $session)
    {
        $this->session = $session;
    }

    public function get(string $id, $default = null)
    {
        return $this->session->get($id, $default);
    }
}

final class SessionExtension extends AbstractExtension
{
    public function getFunctions()
    {
        return [
            new TwigFunction('from_session', [SessionRuntime::class, 'get']),
        ];
    }

    public function getFilters()
    {
        return [
            new TwigFilter('from_session', [SessionRuntime::class, 'get']),
        ];
    }
}

Использование :

Hello {{ 'name'|from_session }}. Last visit: {{ 'last_visit'|from_session('never') }}

Или:

Hello {{ from_session('name') }}

Если вы действительно так сильны после глобалов, вместо этого создайте пользовательский сервис и привяжите его к глобальной переменной session, например:

globals:
    session: `@App\Twig\Runtime\SessionRuntime`


class SessionRuntime
{
    private $session;

    public function __construct(SessionInterface $session)
    {
        $this->session = $session;
    }

    public function __call(string $key, array $params = [])
    {
        return $this->session->get($key);
    }
}

и в ветке:

{{ session.yourSessionKey }}
0 голосов
/ 13 февраля 2020

Нашел решение.
Мне пришлось добавить Twig\Environment в мой класс kernelListener

use Twig\Environment as TwigEnvironment;

class kernelListener {
    private $twigEnvironment;

    public function __construct(TwigEnvironment $twigEnvironment,) {
        $this->twigEnvironment=$twigEnvironment;
    }

    public function onKernelController(ControllerEvent $event) {
        $myGlobalValue='someValue';

        /** @var Session $session */
        $session=$event->getRequest()->getSession();
        $session->set('myGlobalValue', $myGlobalValue)


        $this->twigEnvironment->addGlobal('myGlobalValue', $myGlobalValue);
    }
}

При этом к twigGobalName можно получить доступ во всех видах веточек.

Действительный ответ Эмикса, так как он тоже не неправильный.
Просто ограничение с моей стороны делает мой собственный ответ соответствующим моим потребностям

...