Blade: шаблоны и вёрстка страниц

Рейтинг: 71.7% · 16 голосов
Курс по Laravel: маршруты, Eloquent, Blade, миграции, очереди и API. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
oleg_php
Сообщения: 25
Зарегистрирован: 14 май 2026, 08:06

Blade: шаблоны и вёрстка страниц

Сообщение oleg_php »

АкадемияLaravel с нуляГлава 3 из 18
Оглавление курса (18)
  1. Знакомство с Laravel и установка окружения
  2. Маршруты и контроллеры
  3. Blade: шаблоны и вёрстка страниц (вы здесь)
  4. Миграции и структура базы данных
  5. Eloquent ORM: модели и CRUD
  6. Связи в Eloquent: hasMany, belongsTo и другие
  7. Формы и валидация данных
  8. Аутентификация пользователей
  9. Middleware и защита маршрутов
  10. Очереди и фоновые задачи
  11. Отправка почты и уведомления
  12. Строим REST API на Laravel
  13. Авторизация: Gates и Policies
  14. Работа с файлами: загрузка, Storage, диски local и S3
  15. Тестирование: Pest и PHPUnit, фабрики, сидеры, RefreshDatabase
  16. Сервис-контейнер, провайдеры, свои artisan-команды и планировщик
  17. Деплой в продакшен и обзор современного фронтенда (Vite, Livewire, Inertia)
  18. События и слушатели, кеширование, логирование
В прошлой главе мы возвращали из контроллеров строки и голый HTML. Для реального проекта так жить нельзя: разметка должна лежать отдельно от логики. За это в Laravel отвечает Blade, штатный шаблонизатор. В этой главе научимся отдавать страницы из шаблонов, передавать в них данные и собирать вёрстку из общего каркаса.

Первый шаблон:

Все шаблоны живут в resources/views и заканчиваются на .blade.php. Создайте файл resources/views/articles/index.blade.php и отдайте его из контроллера:

Код: Выделить всё

// app/Http/Controllers/ArticleController.php
public function index()
{
    $articles = [
        ['title' => 'Деплой Laravel на VPS за 500 рублей', 'views' => 1240],
        ['title' => 'Зачем нужен php artisan tinker', 'views' => 318],
    ];

    return view('articles.index', ['articles' => $articles]);
}
Точка в имени 'articles.index' это разделитель папок: Laravel найдёт resources/views/articles/index.blade.php. Вторым аргументом передаём массив данных, его ключи станут переменными внутри шаблона.

Вывод данных и директивы:

Blade компилируется в обычный PHP, поэтому в шаблоне доступно всё, что вы передали. Конструкция {{ $var }} выводит значение и автоматически экранирует HTML через htmlspecialchars. Это защита от XSS, и отключать её без причины не нужно.

Код: Выделить всё

{{-- resources/views/articles/index.blade.php --}}
<h1>Статьи</h1>

@forelse ($articles as $article)
    <article>
        <h2>{{ $article['title'] }}</h2>
        <p>Просмотров: {{ $article['views'] }}</p>
        @if ($loop->first)
            <span>Свежее</span>
        @endif
    </article>
@empty
    <p>Статей пока нет.</p>
@endforelse
@forelse удобнее связки @foreach плюс @if: ветка @empty сработает, когда массив пуст. Внутри любого цикла доступен объект $loop с полями first, last, index, iteration. Комментарии пишите через {{-- --}}, в отличие от HTML-комментариев они не попадут в отдачу браузеру.

Если нужно вывести HTML как есть, существует {!! $html !!}. Используйте его только для данных, которым доверяете на сто процентов, например для разметки из вашей же админки после очистки.

Каркас страницы:

Копировать шапку и подвал в каждый шаблон глупо. Выносим общий каркас в resources/views/layouts/app.blade.php:

Код: Выделить всё

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="utf-8">
    <title>@yield('title', 'Мой блог')</title>
</head>
<body>
    <header>меню</header>
    <main>
        @yield('content')
    </main>
    @include('partials.footer')
</body>
</html>
Дочерний шаблон наследует каркас и заполняет секции:

Код: Выделить всё

@extends('layouts.app')

@section('title', 'Статьи')

@section('content')
    <h1>Статьи</h1>
@endsection
@include подключает кусок шаблона прямо на месте, удобно для футера, пагинации, карточек. У Blade есть и более новый механизм, компоненты (теги вида x-alert), мы вернёмся к ним, когда дойдём до форм в главе 7. Для старта связки @extends, @section и @include хватает с запасом.

Типичные грабли:

Файл назван index.php вместо index.blade.php. Laravel такой шаблон найдёт, но директивы в нём работать не будут, на экран вылезет сырой @foreach.

Ошибка "View [articles.index] not found" почти всегда означает опечатку в имени или не ту папку. Проверяйте путь от resources/views, без расширения.

{!! !!} с пользовательским вводом. Любой комментарий с тегом script превратится в дырку на сайте. Правило простое: по умолчанию {{ }}, исключения только осознанно.

Если правите шаблон, а на сервере ничего не меняется, виноват кэш скомпилированных вью. Лечится командой php artisan view:clear.

И последнее: не тащите запросы к базе в шаблон. Все данные готовит контроллер, Blade только показывает. Это правило сэкономит вам часы отладки.

Итог:

Вы умеете отдавать шаблоны через view(), передавать данные, выводить их с экранированием, крутить циклы и собирать страницы из общего каркаса. В следующей главе займёмся миграциями и структурой базы, а в пятой заменим захардкоженные массивы статей на настоящие модели Eloquent.
👍4 ❤️4 🔥1 😄 🤔1
✔ Лучший ответ сформирован автоматически — qemu_admin
oleg_php писал(а):Laravel такой шаблон найдёт, но директивы в нём работать не будут вот это в точку. убил вечер на эту ерунду, у меня @if печатался прямо на странице, уже думал фреймворк сломан. оказалось назвал файл show.php без blade. жаль laravel тут честную ошибку не кидает
Перейти к ответу →
Аватара пользователя
qemu_admin
Сообщения: 1
Зарегистрирован: 15 май 2026, 03:01

Re: Blade: шаблоны и вёрстка страниц

Сообщение qemu_admin »

✔ Лучший ответ — сформирован автоматически
oleg_php писал(а):Laravel такой шаблон найдёт, но директивы в нём работать не будут
вот это в точку. убил вечер на эту ерунду, у меня @if печатался прямо на странице, уже думал фреймворк сломан. оказалось назвал файл show.php без blade. жаль laravel тут честную ошибку не кидает
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
bash2010
Сообщения: 2
Зарегистрирован: 12 май 2026, 10:20

Re: Blade: шаблоны и вёрстка страниц

Сообщение bash2010 »

А как Blade уживается с Vue? У него же тоже двойные фигурные скобки. Получается Laravel попытается обработать {{ message }} как свою переменную и упадет с ошибкой undefined variable?
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
BashChan
Сообщения: 1
Зарегистрирован: 17 май 2026, 03:44

Re: Blade: шаблоны и вёрстка страниц

Сообщение BashChan »

Отвечу про Vue, сам недавно разбирался: ставишь собаку перед скобками, @{{ message }}, и Blade отдает их браузеру как есть. А если вьюшного кода много, оборачиваешь весь блок в @verbatim ... @endverbatim и внутри пишешь спокойно.
👍1 ❤️2 🔥1 😄 🤔
Аватара пользователя
johnbig
Сообщения: 2
Зарегистрирован: 16 май 2026, 05:19

Re: Blade: шаблоны и вёрстка страниц

Сообщение johnbig »

Спасибо за $loop, не знал про него. До этого таскал счетчик руками через @php $i++ @endphp, выглядело стремно. И про view:clear отдельный плюс, на шареде у меня после деплоя по ftp шаблоны неделями старые висели, теперь понятно почему.
👍3 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Маршруты и контроллеры
Следующая глава →
Миграции и структура базы данных

Все главы курса «Laravel с нуля»

Поделиться темой: ✈ Telegram VK

Вернуться в «Laravel с нуля»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость