Пользовательское расширение - это путь к 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 }}