У меня есть это действие контроллера:
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, как описано здесь: 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 и т. д.), и даже кэшировать дорогостоящие операции внутри расширения, если вам нужно, чтобы функция выполнялась более одного раза.
Вы всегда можете зарегистрировать глобальные в twig.