@gog69

Sub-request или service?

лейаут состоит из 4 частей: header, content, sidebar, footer

данные для серединки (content,sidebar) планирую чтоб возвращал контроллер

public function indexAction() 
{
   ...
   return $this->render($tpl, [
     "content" => $this->get('service')->getDataForCurrentPage(),
     "sidebarContent" => $this->get('service')->getSidebar3()
  ])
}


для динамические данных хедера и футера вижу следующие варианты:

1. через Sub-request {{ render(controller( 'controller:headerAction' )) }}
2. через service и расширение твиг
<div class="wrapper">
    {% for item in getDataForHeader() %}
         <div class=" ..  ." >
              {{  item.render() }}
         </div>
    {% endfor %}
</div>

3. достать одним вызовом данные для всего
{% set layoutData = getLayoutData() %}
.....
{% for item in layoutData.header %}
...
{% endfor %}
.......
.....
{% for item in layoutData.footer %}
   some rendering
{% endfor %}
{ endfor %}


4. так же как и 3 только при загрузке бандла - загнать данные сразу в глобальную переменную твиг вместо вызова {% set layoutData = getLayoutData() %}

5. так же как 4 только пометить несколько сервисов тегами, каждый из которых загонит данные в лейаут

как лучше и гибче все это сделать?

ПС. эта задача актуальна для абсолютно любого проекта и будет очень странно если будет 100 просмотров этой темы и 5 ответов. как это делают остальные 95 человек - тоже интересно
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 1
skobkin
@skobkin
Гентушник, разработчик на PHP и Symfony.
Первый вариант вполне нормальный.
Второй - довольно бессмысленный. Городить расширение для того, для чего оно не нужно.
Третий - не очень хорош, т.к. в данном случае абсолютно левым контроллерам придётся что-то знать о заголовке, хотя они занимаются совсем другим.
Четвёртый - тоже не лучшая мысль.
Пятый - пожалуй, тоже.

Я бы выбрал первый вариант, когда отдельный экшен занимается выводом данных для хидера или сайдбара.
Ответ написан
Ваш ответ на вопрос

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

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