Урок 05

Blade: шаблоны

Что такое Blade

Blade — это шаблонизатор Laravel. Он позволяет писать HTML с вставками PHP-кода через специальный синтаксис. Шаблоны лежат в resources/views/ и имеют расширение .blade.php. Blade компилируется в обычный PHP и кешируется, поэтому работает быстро.

Простой шаблон

resources/views/hello.blade.php:

<!DOCTYPE html>
<html>
<head><title>Hello</title></head>
<body>
    <h1>Привет, {{ $name }}</h1>
</body>
</html>

Возврат шаблона из роута:

Route::get('/hello', function () {
    return view('hello', ['name' => 'Мир']);
});

Вывод данных

Двойные фигурные скобки {{ }} выводят значение и автоматически экранируют HTML — это защита от XSS.

{{ $name }}
{{ $user->email }}
{{ 2 + 2 }}

Если нужно вывести сырой HTML (например, из доверенного источника) — используют {!! !!}:

{!! $htmlContent !!}

Это небезопасно для пользовательских данных.

Условия

@if ($user->isAdmin())
    <p>Админ</p>
@elseif ($user->isModerator())
    <p>Модератор</p>
@else
    <p>Пользователь</p>
@endif

Директива @unless выполняет блок, если условие ложно:

@unless ($user->isAdmin())
    <p>Не админ</p>
@endunless

Циклы

@foreach ($posts as $post)
    <article>{{ $post->title }}</article>
@endforeach

@forelse — это @foreach с обработкой пустого массива:

@forelse ($posts as $post)
    <p>{{ $post->title }}</p>
@empty
    <p>Постов нет</p>
@endforelse

Переменная $loop

Внутри @foreach доступна переменная $loop с информацией об итерации:

@foreach ($posts as $post)
    {{ $loop->index }}       {{-- с 0 --}}
    {{ $loop->iteration }}   {{-- с 1 --}}
    {{ $loop->first ? 'первый' : '' }}
    {{ $loop->last ? 'последний' : '' }}
@endforeach

Layouts

Layout — это общий каркас страницы, который наследуют другие шаблоны.

resources/views/layouts/app.blade.php:

<!DOCTYPE html>
<html>
<head>
    <title>@yield('title', 'Мой сайт')</title>
</head>
<body>
    @yield('content')
</body>
</html>

Директива @yield — это место, куда дочерний шаблон вставит свой контент.

Дочерний шаблон:

@extends('layouts.app')

@section('title', 'Главная')

@section('content')
    <h1>Добро пожаловать</h1>
@endsection

@extends указывает, какой layout использовать. @section заполняет блоки, объявленные через @yield.

Компоненты

Blade-компоненты — переиспользуемые куски разметки:

php artisan make:component Alert

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

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

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

<x-alert>
    Сохранено!
</x-alert>

$slot — это содержимое, переданное внутрь компонента.