Skip to content

Blade Templates

Структура директорий

resources/views/
├── layouts/          — layouts (app, admin, email)
├── components/       — переиспользуемые компоненты
├── pages/            — статические страницы
├── {section}/        — динамические секции (services/, brands/, etc.)
├── partials/         — фрагменты, не являющиеся компонентами
└── errors/           — 404, 500, 503

Layouts

  • Один основной layout: layouts.app — header, footer, meta, Vite assets
  • Отдельный layout для разделов с другим дизайном (calc, email)
  • Sections: @yield('title'), @yield('description'), @yield('content'), @yield('meta')
  • Стек для скриптов: @stack('scripts') в layout, @push('scripts') в page

Escaping — критично

СинтаксисКогдаПример
ВСЕГДА по умолчаниюИмя, цена, описание
{!! $html !!}ТОЛЬКО доверенный HTML из админкиSEO-блоки, rich content из Filament
@js($var)Передача в JSBlade → Alpine/JS переменная

{!! !!} с пользовательским вводом = XSS уязвимость. Без исключений.

Компоненты

Anonymous vs Class-based

  • Anonymous (файл в components/) — для простых UI-блоков без логики
  • Class-based — когда нужна логика подготовки данных, инъекция сервисов

Props

  • @props с типизацией и default-значениями
  • Обязательные props — без default
  • Массивы/объекты: :prop="$var" (с двоеточием)

Типичные компоненты проекта

КомпонентНазначение
breadcrumbsНавигация с Schema.org BreadcrumbList
seo-blocksSEO-контент по position/page_type
contact-formФорма заявки (CSRF, валидация)
cta-blockCall-to-action блок
paginationКастомная пагинация

SEO в шаблонах

Каждая публичная страница ОБЯЗАНА содержать:

  • <title> через @section('title')
  • <meta name="description"> через @section('description')
  • Canonical URL
  • Open Graph: og:title, og:description, og:url, og:type
  • Breadcrumbs с Schema.org BreadcrumbList
  • Structured data (JSON-LD) по типу страницы

Partials и циклы

  • @include для фрагментов, не являющихся компонентами (card в цикле)
  • @forelse вместо @foreach — всегда обрабатывать пустое состояние (@empty)
  • Не использовать @include в глубокой вложенности (3+ уровня) — заменить на компонент

Assets (Vite)

  • CSS и JS — через @vite() directive
  • Не инлайнить большие CSS/JS блоки в шаблоне
  • Изображения из medialibrary — через URL модели, не хардкод путей
  • Lazy loading для изображений ниже fold: loading="lazy"

Условные секции

  • @auth / @guest — для авторизованных/гостевых блоков
  • @isset($var) — безопасная проверка перед использованием
  • @env('production') — для production-only (analytics, tracking)
  • Не дублировать логику в Blade — если сложное условие, вычислить в контроллере/сервисе

Anti-patterns

ПаттернПроблемаРешение
{!! $userInput !!}XSS уязвимость
Запросы к БД в BladeСкрытые N+1, невозможно профилироватьПодготовить данные в контроллере
@php блоки с логикойBlade — не место для логикиКонтроллер / Service / ViewComposer
@foreach без @emptyПустой список — пустая страница@forelse + @empty
Хардкод URL в <a href="/...">Ломается при смене роутовroute('name') или url()
@include 4+ уровней вложенностиНевозможно отследить поток данныхКомпонент
CSS/JS инлайн в шаблонеНе кешируется, дублируетсяVite assets
Отсутствие canonical / og:tagsПлохой SEO, дубли в индексеВсегда в layout
Автопрокрутка/marquee-анимацииРаздражают пользователя, нарушают UXГоризонтальный overflow-x:auto + drag-to-scroll
Emoji вместо иконок (UI-блоки, отрасли)Непрофессионально, нет контроля над стилемТолько SVG-иконки

Внутренняя база знаний студии