Шаблонизация и представления

6 / 21
20 мин чтения
Введение
О чём говорим

В прошлой части мы разобрали базу данных и увидели важную разницу: Laravel даёт “культуру данных из коробки”, а Битрикс — “данные платформы”, где многое уже встроено в ядро и модули.

Теперь логичный следующий слой: как эти данные превращаются в UI. В Laravel это обычно контроллер → view (Blade). В Битриксе чаще всего страница → компонент → шаблон компонента (с кэшем и параметрами).

В этой части разберём:

  • где живут шаблоны и как устроена “сборка страницы”,
  • как правильно передавать данные в представления (и куда не стоит пихать бизнес‑логику),
  • что считать компонентами в каждом мире (Blade Components vs компоненты Битрикса),
  • и как подключаются CSS/JS (Vite vs Asset Manager).

Шаблонизаторы: Blade vs “PHP‑шаблоны” в Битриксе

Шаблонизация — это про две вещи одновременно:

  • как удобно писать HTML (структура, переиспользование, инклюды, компоненты),
  • как безопасно и предсказуемо выводить данные (экранирование, политика вывода, минимизация логики в шаблоне).

Ключевой философский контраст:

  • Laravel предлагает Blade как “тонкий” слой над PHP: директивы, наследование, компоненты, автоэкранирование.
  • Битрикс исторически использует обычный PHP в шаблонах, но поверх него строит “каркас страницы” через компоненты, их параметры, шаблоны, кэш и соглашения платформы.

Laravel: где живут view и как они рендерятся

Где лежат шаблоны

Обычно это resources/views. Файл resources/views/posts/index.blade.php вызывается так:

        return view('posts.index', [
    'posts' => $posts,
]);

    

Имя posts.index — это путь внутри resources/views без расширения, где слэш заменён на точку.

Blade “как PHP, но дисциплинированнее”

Blade компилируется в PHP и кешируется в storage/framework/views. Это значит:

  • Blade сам по себе не делает страницу быстрее, он делает её удобнее и безопаснее.
  • Производительность решается архитектурой (кэш, запросы, объёмы данных), а не выбором синтаксиса.

Автоэкранирование: {{ }} vs {!! !!}

Самая важная привычка:

  • {{ $title }}экранирует HTML (безопаснее по умолчанию).
  • {!! $html !!} — выводит “как есть” (опасно, если это не ваш доверенный HTML).
        <h1>{{ $post->title }}</h1>
<div class="content">{!! $post->trusted_html !!}</div>

    

Практическая мысль: в Laravel безопасность “подталкивается” в правильную сторону дефолтом. Если вы везде пишете {{ }}, XSS ловится реже.

Bitrix: шаблон — это PHP, а “структура UI” чаще строится компонентами

Где живут шаблоны

В Битриксе “шаблон” — это не только файл страницы (/catalog/index.php). Главная единица UI — компонент и его шаблон.

Типовой путь (упрощённо):

  • общий шаблон сайта: /local/templates/<имя_шаблона>/
  • шаблоны компонентов: /local/templates/<имя_шаблона>/components/<vendor>/<component>/<template>/
  • файл вывода: template.php

Смысл: вы не “рендерите view”, вы подключаете компонент, который сам:

  • получает параметры ($arParams),
  • строит результат ($arResult),
  • рендерит HTML через template.php,
  • (часто) кэширует результат.

Передача данных в шаблон: $arResult

Внутри шаблона компонента вы обычно используете:

  • $arParams — входные параметры,
  • $arResult — данные для вывода,
  • $this — объект шаблона (для служебных методов).

Ключевой “битриксовый” приём: не держать подготовку данных в template.php.

При этом архитектурно лучше, чтобы трансформация была явной и контролируемой:

  • основной путь: вся подготовка/нормализация данных — в логике компонентаclass.php), где это видно, сопровождаемо и не “всплывает” как скрытая стадия обработки;
  • result_modifier.php лучше не использовать как стандартный слой, потому что он добавляет неочевидный этап трансформации. Его можно оставить как компромиссный инструмент, если вы используете чужой компонент/шаблон и вам нужно сделать небольшой “view‑тюнинг”, не вмешиваясь в логику компонента.

Экранирование и безопасность: дисциплина важнее синтаксиса

В Битриксе шаблон — это PHP, а значит легко написать небезопасный вывод “по привычке”.

В простом виде:

        <h1><?= htmlspecialcharsbx($arResult['TITLE']) ?></h1>

    

Практическая мысль: Битрикс позволяет написать очень быстрый и гибкий шаблон, но безопасность и чистота кода — это ваша дисциплина и правила команды.

Компонентный подход: Blade Components vs компоненты Битрикса

Слово “компонент” в двух стеках означает похожее, но “вес” у понятия разный:

  • В Laravel Blade Components — это в основном про переиспользование UI‑фрагментов.
  • В Битриксе компонент — это зачастую мини‑приложение: выборка данных, кэш, параметры, шаблоны, ЧПУ/ссылки, события.

Laravel: Blade Components (и почему это хороший стандарт UI)

Простой (анонимный) компонент

resources/views/components/alert.blade.php:

        @props(['type' => 'info'])

<div class="alert alert-{{ $type }}">
    {{ $slot }}
</div>

    

Использование:

        <x-alert type="warning">
    Проверьте данные перед сохранением.
</x-alert>

    

Класс‑компонент (когда нужна логика)

app/View/Components/Price.php:

        namespace App\View\Components;

use Illuminate\View\Component;

final class Price extends Component
{
    public function __construct(
        public int $value,
        public string $currency = 'RUB',
    ) {}

    public function render()
    {
        return view('components.price');
    }
}

    

resources/views/components/price.blade.php:

        <span class="price">
    {{ number_format($value / 100, 2, '.', ' ') }} {{ $currency }}
</span>

    

Практическая мысль: UI‑компоненты Blade удобно держать “глупыми” (dumb): минимальная логика, понятные входы, максимум переиспользования.

Bitrix: компоненты (простые/комплексные) и их шаблоны

Компонент как “контроллер+view” в одном

Когда вы подключаете компонент (например, список новостей/каталога), вы фактически говорите:

  • что выводить (параметры),
  • как получать данные (логика компонента),
  • и как это отображать (шаблон компонента).

Простой пример подключения компонента в странице:

        <?php
$APPLICATION->IncludeComponent(
    'bitrix:news.list',
    'cards',
    [
        'IBLOCK_ID' => 5,
        'NEWS_COUNT' => 12,
        'CACHE_TYPE' => 'A',
        'CACHE_TIME' => 3600,
    ]
);

    

Где готовить данные: явная подготовка в компоненте (и почему это важнее “удобных хуков”)

Если вы пишете свой компонент, самый устойчивый вариант — готовить “view model” в самом компоненте:

  • class.php — выборка и подготовка данных,
  • template.php — только вывод.

Так трансформация данных остаётся явной: её проще читать, дебажить и поддерживать в команде.

Наследование UI и “layout” в Битриксе

Blade предлагает наследование шаблонов (@extends, @section, @yield) как базовую механику.

В Битриксе роль “layout” обычно играет шаблон сайта:

  • header.php / footer.php,
  • файлы включаемых областей,
  • и общие структуры страницы (шапка/меню/подвал) вокруг компонентов.

Практическая мысль: в Laravel layout — часть системы views. В Битриксе layout — часть системы “шаблона сайта”.

Assets (CSS, JS): Vite в Laravel vs Asset Manager в Битриксе

Фронтенд‑ассеты — это не “как подключить файл”, а:

  • как собрать и версионировать (cache busting),
  • как организовать зависимости,
  • как не словить конфликт библиотек,
  • как сделать производительный вывод (минимум блокирующих ресурсов).

Laravel: Vite как стандартный пайплайн

В Laravel 12 стандартный способ подключать ассеты — Vite.

В layout‑шаблоне:

        @vite(['resources/css/app.css', 'resources/js/app.js'])

    

Дальше Vite даёт:

  • сборку,
  • hot reload в dev,
  • версионирование файлов в production,
  • нормальную работу с современным фронтенд‑стеком.

Практическая мысль: если в проекте есть JS “серьёзнее пары скриптов”, Vite — это не роскошь, а нормальная база.

Bitrix: Asset Manager и расширения (и почему важно “не подключать как попало”)

В Битриксе классический механизм подключения ресурсов — Asset Manager:

        use Bitrix\Main\Page\Asset;

Asset::getInstance()->addCss(SITE_TEMPLATE_PATH . '/assets/app.css');
Asset::getInstance()->addJs(SITE_TEMPLATE_PATH . '/assets/app.js');

    

Также встречаются “расширения” и зависимости через ядро (исторически — CJSCore, в современном виде — UI‑модули/расширения).

Реальность проектов:

  • часть ресурсов подключается в header.php шаблона сайта,
  • часть — в шаблонах компонентов,
  • часть — из модулей.

Именно поэтому в Битриксе важны правила:

  • где подключаем глобальные ассеты,
  • где подключаем ассеты компонента,
  • и как не подключать одну и ту же библиотеку 3 раза разными способами.

Практическая мысль: Asset Manager — полезная “точка сборки” ресурсов, но порядок и дисциплина подключения в Битриксе заметно сильнее влияет на стабильность, чем в “чистом” Laravel‑проекте.

Типовые ошибки в представлениях (в обоих стеках)

Кейс A Бизнес‑логика в шаблоне

Если вы видите в шаблоне:

  • SQL/ORM вызовы,
  • вызовы внешних API,
  • сложные расчёты/условия,
  • и “если пользователь такой — то так, а если другой — то иначе” на 100 строк,

то UI перестаёт быть UI.

Решение
  • Laravel: контроллер/сервис → ViewModel (или DTO) → Blade.
  • Битрикс: компонент (class.php/component.php) → “чистый” template.php (и минимум неявных прослоек).

Кейс B Непредсказуемое экранирование (XSS)

  • Laravel помогает дефолтом ({{ }}).
  • Битрикс требует дисциплины (htmlspecialcharsbx, фильтры, строгие правила “что можно выводить как HTML”).

Кейс C “Склеивание” layout и бизнес‑части

В Laravel лучше держать общий layout отдельно и не превращать app.blade.php в монстра.
В Битриксе важно не превращать header.php в место, где живёт всё (условия, запросы, ветвления по доменам/пользователям и т.д.).

Кейс D Кэш: включили — и забыли про актуальность

В UI‑слое часто есть “живые” элементы:

  • корзина,
  • счётчики,
  • персональные рекомендации,
  • данные пользователя.

В Laravel вы чаще кэшируете данные/результаты (Cache facade, HTTP cache, reverse proxy).
В Битриксе очень легко включить кэш компонента и затем удивляться, почему “у всех один и тот же блок”.

Решение явно понимать, что кэшируется: “общий HTML” или “персональные данные”.

Сравнительная таблица: шаблонизация и представления

Шкала (как и раньше): от -2 до +2.

Критерий Laravel (баллы) Битрикс (баллы) Комментарий
Читаемость и единообразие шаблонов +2 0 Blade задаёт стандарты и привычки. В Битриксе шаблоны — это PHP, многое зависит от команды и “наследия проекта”.
Переиспользование UI (компоненты) +2 +2 Blade Components сильны для UI. Компоненты Битрикса сильны как “контент+кэш+шаблон” (но тяжелее и “шире” по смыслу).
“Гигиена данных” до шаблона +1 +1 Laravel: ViewModels/DTO/Resource’ы — как практика. Битрикс: явная подготовка данных в class.php и дисциплина “шаблон только рендерит”.
Безопасный вывод по умолчанию +2 0 В Blade безопасный вывод — дефолт. В Битриксе безопасно, если вы соблюдаете правила.
Пайплайн ассетов (современный фронтенд) +2 +1 Vite — стандарт и привычная DX. В Битриксе можно собрать современно, но часто “зоопарк подключений” требует отдельной дисциплины.
Кэширование на уровне UI +1 +2 В Битриксе кэш компонентов и управляемый кэш — часть повседневности. В Laravel обычно кэшируют данные/ответы, UI‑кэш — скорее отдельное решение.
Итого за статью +10 +6
Общий счёт (накопительный) +47 +22 Счёт накапливается по мере выхода статей.
Заключение
Blade — про чистый UI‑слой, Битрикс — про UI как часть платформы

Blade даёт очень предсказуемый, безопасный и “командный” способ писать представления: layout’ы, компоненты, автоэкранирование, понятная структура resources/views.

Битрикс даёт другой бонус: компоненты — это не просто “кусок UI”, а готовая архитектурная единица с параметрами, кэшем и соглашениями платформы. Цена — более высокая зависимость от дисциплины команды: где готовить данные, как экранировать вывод, где подключать ассеты, что кэшировать.

В следующей части перейдём к тому, где UI встречается с входными данными: формы и валидация (Form Request и validation rules в Laravel vs обработка форм и валидация в Битриксе).

🛠 Практическая работа

“Карточки товаров/новостей” в двух стеках

Цель: почувствовать разницу “view как слой” vs “компонент как мини‑приложение”, а не сделать идеальный фронтенд.

Задание для Laravel

Соберите страницу /catalog (или /posts) со списком карточек:

  1. Layout resources/views/layouts/app.blade.php с секциями content и title.
  2. Компонент карточки <x-card> с параметрами (title, subtitle, url).
  3. В контроллере подготовьте массив данных (10–20 элементов) и передайте в view.
  4. Подключите CSS/JS через @vite(...).
  5. Проверьте экранирование: пользовательский title должен безопасно отображаться как текст.

Опорные доки: Blade, Views, Vite.

Задание для Битрикса

Сделайте аналогичный список карточек через компонент:

  1. Подключите bitrix:news.list (или ваш кастомный компонент) с отдельным шаблоном cards.
  2. Подготовьте “view model” явно в логике компонента (class.php/component.php): TITLE, SUBTITLE, URL.
  3. В template.php сделайте “чистый” рендер карточек и экранируйте вывод.
  4. Включите кэш компонента (на 1 час) и отдельно проверьте: какие блоки должны быть “персональными” и не должны кэшироваться.
  5. Подключите CSS/JS через Asset Manager (лучше из шаблона сайта или из шаблона компонента — по правилам вашего проекта).

Цель упражнения — почувствовать: в Битриксе UI‑слой почти всегда “сцеплен” с кэшем и параметрами компонента, и это одновременно сила и ответственность.

Мы используем файлы cookie для улучшения работы сайта. Продолжая использовать сайт, вы соглашаетесь с нашей политикой конфиденциальности.