@MasterCopipaster

Symfony 4 как написать middleware для меню?

Всем привет, подскажите как решить следующию проблему, у меня есть twig шаблоны которые выгледят так

├── base.html.twig
├── email
│   └── index.html.twig
├── footer.html.twig
├── header.html.twig
├── index
│   ├── index.html.twig
│   ├── modal_load_file.html.twig
│   └── modal_load_link.html.twig
└── output
└── index.html.twig

В файле header.html.twig у меня выводится меню вот так:
Это контроллер для главной страницы

/**
     * @Route("/", name="index", methods={"GET","HEAD"})
     */
    public function index()
    {
       $menu = $this->getMenu();
       // some code
              return $this->render('index/index.html.twig', [
            // some vars
            'menu' => $menu
        ]);
    }

base.html.twig выглядит так
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <title>{% block title %}Welcome!{% endblock %}</title>
        <link rel="stylesheet" href="{{ asset('css/bootstrap.min.css') }}"/>
        <link rel="stylesheet" href="{{ asset('css/datepicker.min.css') }}"/>
        <link rel="stylesheet" href="{{ asset('css/main.css') }}"/>
        <script src="{{ asset('js/jquery-3.4.1.min.js') }}" type="text/javascript"></script>
        <script src="{{ asset('js/popper.min.js') }}" type="text/javascript"></script>
        <script src="{{ asset('js/bootstrap.min.js') }}" type="text/javascript"></script>
        <script src="{{ asset('js/datepicker.min.js') }}" type="text/javascript"></script>
        <script src="{{ asset('js/validator.form.js') }}" type="text/javascript"></script>
        <script src="{{ asset('js/download.files.js') }}" type="text/javascript"></script>
        <script src="{{ asset('js/download.link.js') }}" type="text/javascript"></script>
        <script src="{{ asset('js/main.js') }}" type="text/javascript"></script>


        {% block stylesheets %}{% endblock %}
    </head>
    <body>
    {{ include('header.html.twig') }}
        {% block body %}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
    {{ include('footer.html.twig') }}
<script>

</script>
</html>

Вот индексная страница работает все ок, но когда я захожу на другой контроллер
То меню не работает (что вообщем то логично)
например

└── output
└── index.html.twig

base не может показать страницу потому что меню небыло передано в качестве параметра в шаблон, я считаю что в каждом контроллере передавать меню отдельно в качестве параметра в twig это дич кто ни буть знает как сделать так что бы при попытке зайти на любую страницу (ну или выбраную зарание группу страниц) метод возвразщаемый меню
автоматически передавай эти данные в twig? В laravel это делает через middleware в symfony сколько не гуглил так и не понял как это сделать правельно. Может кто подскажит как красиво решить данный вопрос?
  • Вопрос задан
  • 162 просмотра
Решения вопроса 1
Maksclub
@Maksclub
maksfedorov.ru
Twig Extension

Создайте свой экстеншн, передав ему ваши сервисы (репозиторий например)
В методе getFunctions() зарегайте свою твиг-функцию

Зарегайте его с тегом twig.extension
Вызывайте в ваших шаблонах
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы