@summon7300
Backend-разработчик

Аналог компонентов 1C-Bitrix в Symfony?

Всем доброго дня.
Сейчас знакомлюсь с Symfony, до этого около 2 лет работал с 1C-Bitrix.
Т.к. в 1С-Bitrix роль контроллеров, грубо говоря, выполняют компоненты, интересен такой кейс:
  1. Есть шаблон сайта, состоящий из двух колонок.
  2. Левая колонка - сайдбар с меню сайта и кратким анонсом последних новостей.
  3. Правая колонка - контентая область, т.е. её содержимое меняется в зависимости от текущего раздела сайта.

Так вот, в Bitrix можно было список последних новостей реализовать через компонент, и разместить его в шаблоне сайта. После этого при создании новой страницы достаточно было заниматься контентой частью страницы, сайдбар рендерился сам по себе и внимания не требовал. Получается что, в каком-то смысле, можно было использовать несколько контроллеров на одной странице одновременно.
Сейчас подобный кейс нужно сделать в Symfony, но т.к. тут наследование в шаблонах Twig, получается что в каждом контроллере нужно выбирать список последних новостей?
Каким образом в Symfony принято решать подобную задачу? Использовать какую-то общую модель, которую необходимо вызывать в каждом контроллере, и передавать результат в шаблон? Или можно как-то один раз, в родительском шаблоне, указать как нужно выбрать новости?
  • Вопрос задан
  • 1320 просмотров
Решения вопроса 2
lexxpavlov
@lexxpavlov
Программист, преподаватель
В Symfony обычно основной код работает в сервисах, а контроллер вызывает нужный сервис. Большой плюс - один раз создал код работы с сущностью, и можно использовать его в любом месте - в любом контроллере, в другом сервисе, в шаблоне. Весь год работы с сущностью - в одном месте (в одном сервисе).
1) Сделать сервис, который строит список последних новостей (этот же сервис использует кэш).
2) Создать Twig расширение, которое добавляет функцию получения списка последних новостей (получение из созданного сервиса). Например, создать функцию "lastNews". Ссылку на сервис новостей настроить через контейнер (в services.yml, или где там делаете сервисы). (ссылки для создания функций: 1, 2)
3) В основном шаблоне (app/Resources/views/layout.html.twig) вызвать созданную функцию. Упрощённо примерно вот так:
{# app/Resources/views/base.html.twig #}
<!DOCTYPE html>
<html lang="ru">
    <head>
    </head>
    <body>
        {% block body%}{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>


{# app/Resources/views/layout.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
<div class="container">
    <div class="sidebar">
        {% block sidebar %}
            <ul class="sidebar-menu">
            {% for item in lastNews() %}
              <li><a href="{{ item.href }}">{{ item.title }}</a></li>
            {% endfor %}
            </ul>
        {% endblock %}
    </div>
    <div class="content">
        {% block content %}
        {% endblock %}
    </div>
</div>
{% endblock %}
Ответ написан
@shaqster
Symfony3 Guru
Получается что, в каком-то смысле, можно было использовать несколько контроллеров на одной странице одновременно.

https://symfony.com/doc/current/templating/embeddi...
Если очень хочется, то можно вот так:
{{ render(controller('AppBundle:Article:recentArticles' )) }}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы