Как поделиться переменными со всеми представлениями (включая поведение) в twig?

У меня есть это действие контроллера:

   public function index(Request $request)
    {
        $start = $request->get('start', 0);
        $limit = $request->get('limit', 10);
        $articles = $this->articleRepository->all($start, $limit);
        $navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());

        return $this->render('article/index.html.twig', [
            'articles' => $articles,
            'navigation'=>$navigation
        ]);
    }

Я создаю меню с:

$navigation = $this->menu->build()->render(new RenderStrategyBootstrap4());

Теперь это поведение высокого уровня, и я не хочу отображать его для каждого действия. Есть ли способ в Symfony переместить это поведение в своего рода композитор представления (например, в Laravel?), а затем поделиться переменной с представлением?

Или нет возможности и нужно создавать базовый контроллер?

Вы всегда можете зарегистрировать глобальные в twig.

DarkBee 15.05.2019 14:10
Встроенные контроллеры - это один подход.
Cerad 15.05.2019 14:10

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

Joe 15.05.2019 14:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
3
180
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете создать пользовательское расширение Twig, как описано здесь: https://symfony.com/doc/current/templating/twig_extension.html

Там вы можете зарегистрировать пользовательскую функцию Twig следующим образом:

public function getFunctions()
{
    return array('renderNavigation' => new TwigFunction(
              'renderNavigation',
              array($this, 'renderNavigation'),
              array('needs_environment' => true, 'is_safe' => array('html'))
           );
}

public function renderNavigation(Environment $twig)
{
    /* ... */
    return $twig->render(/* ... */);
}

Затем вы можете использовать эту функцию в каждом шаблоне, например {{ renderNavigation() }}

Поскольку расширение Twig само по себе является сервисом, вы можете внедрить любой другой сервис, который вам нужен (например, RequestStack, EntityManager и т. д.), и даже кэшировать дорогостоящие операции внутри расширения, если вам нужно, чтобы функция выполнялась более одного раза.

Другие вопросы по теме