Как поделиться переменными для всех представлений (включая поведение) в ветке? - PullRequest
1 голос
/ 15 мая 2019

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

   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?), А затем поделиться этой переменной с представлением?

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

1 Ответ

1 голос
/ 15 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...