Может войдёшь?
Черновики Написать статью Профиль

Шаблоны Blade

перевод документация 5.х

  1. 1. Введение
  2. 2. Наследование шаблонов
    1. 2.1. Определение макета
    2. 2.2. Наследование макета
  3. 3. Отображение данных
  4. 4. Управляющие конструкции
  5. 5. Стеки
  6. 6. Внедрение сервисов
  7. 7. Наследование Blade
Этот перевод актуален для англоязычной документации на (ветка 5.2) и (ветка 5.1). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

Blade — простой, но мощный шаблонизатор, поставляемый с Laravel. В отличие от других популярных шаблонизаторов для PHP Blade не ограничивает вас в использовании чистого PHP-кода в ваших представлениях. Все представления Blade скомпилированы в чистый PHP-код и кешированы, пока в них нет изменений, а значит, Blade практически не нагружает ваше приложение. Файлы представлений Blade используют расширение .blade.php и обычно хранятся в папке resources/views.

Наследование шаблонов

Определение макета

Два основных преимущества использования Blade — наследование шаблонов и секции. Для начала давайте рассмотрим простой пример. Во-первых, изучим макет «главной» страницы. Поскольку многие веб-приложения используют один общий макет для разных страниц, удобно определить этот макет как одно представление Blade:

PHP
<!-- Хранится в resources/views/layouts/master.blade.php -->

<
html>
  <
head>
    <
title>App Name - @yield('title')</title>
  </
head>
  <
body>
    @
section('sidebar')
      
Это главная боковая панель.
    @
show

    
<div class="container">
      @yield(
'content')
    </
div>
  </
body>
</
html>

Как видите, этот файл имеет типичную HTML-разметку. Но обратите внимание на директивы @section и @yield. Директива @section, как следует из её названия, определяет секцию содержимого, а директива @yield используется для отображения содержимого данной секции.

Мы определили макет для нашего приложения, давайте определим дочернюю страницу, которая унаследует макет.

Наследование макета

При определении дочерней страницы вы можете использовать Blade-директиву @extends для указания макета, который должен быть «унаследован» дочерней страницей. Представления, которые наследуют макет Blade, могут внедрять содержимое в секции макета с помощью директив @section. Запомните, как видно из приведённого выше примера, содержимое этих секций будет отображено в макете при помощи @yield:

PHP
<!-- Хранится в resources/views/child.blade.php -->

@extends(
'layouts.master')

@
section('title''Page Title')

@
section('sidebar')
    @
parent

    
<p>Это дополнение к основной боковой панели.</p>
@
endsection

@section('content')
    <
p>Это содержимое тела страницы.</p>
@
endsection

В этом примере секция sidebar использует директиву @parent для дополнения (а не перезаписи) содержимого к боковой панели макета. Директива @parent будет заменена содержимым макета при отрисовке представления.

Конечно, как и чистые PHP-представления, Blade-представления могут быть возвращены из маршрутов при помощи глобальной вспомогательной функции PHPview():

PHP
Route::get('blade', function () {
  return 
view('child');
});

Отображение данных

Вы можете отобразить данные, переданные в ваши Blade-представления, обернув переменную в фигурные скобки. Например, для такого маршрута:

PHP
Route::get('greeting', function () {
  return 
view('welcome', ['name' => 'Samantha']);
});

Вы можете отобразить содержимое переменной name вот так:

PHP
Hello, {{ $name }}.

Вы не ограничены отображением только содержимого переменных, передаваемых в представление. Вы также можете выводить результаты любых PHP-функций. На самом деле, вы можете поместить любой необходимый PHP-код в оператор вывода Blade:

PHP
The current UNIX timestamp is {{ time() }}.

Blade-оператор PHP{{ }} автоматически отправляется через PHP-функцию PHPhtmlentities() для предотвращения XSS-атак.

Blade и JavaScript-фреймворки

Поскольку многие JavaScript-фреймворки тоже используют фигурные скобки для обозначения того, что данное выражение должно быть отображено в браузере, то вы можете использовать символ @, чтобы указать механизму отрисовки Blade, что выражение должно остаться нетронутым. Например:

PHP
<h1>Laravel</h1>

Hello, @{{ name }}.

В этом примере Blade удалит символ @, но выражение PHP{{ name }} останется нетронутым, что позволит вашему JavaScript-фреймворку отрисовать его вместо Blade.

Вывод переменных после проверки на существование

Иногда вам надо вывести значение переменной, но вы не уверены, задано ли оно. То есть вы хотите сделать так:

PHP
{{ isset($name) ? $name 'Default' }}

Вместо написания тернарного оператора Blade позволяет вам использовать такое удобное сокращение:

PHP
{{ $name or 'Default' }}

Если переменная $name имеет значение, то оно будет отображено, иначе будет выведено слово Default.

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

По умолчанию Blade-оператор PHP{{ }} автоматически отправляется через PHP-функцию PHPhtmlentities() для предотвращения XSS-атак. Если вы не хотите экранировать данные, используйте такой синтаксис:

PHP
Hello, {!! $name !!}.

Будьте очень осторожны и экранируйте переменные, которые содержат ввод от пользователя. Всегда используйте двойные скобки, чтобы экранировать все HTML-сущности.

Как показывает практика, вместо экранирования только пользовательских переменных безопаснее экранировать весь вывод, делая исключения только в редких случаях — прим. пер.

Управляющие конструкции

В дополнение к наследованию шаблонов и отображению данных Blade предоставляет удобные сокращения для распространенных управляющих конструкций PHP, таких как условные операторы и циклы. Эти сокращения обеспечивают очень чистый и краткий способ работы с управляющими конструкциями PHP и при этом остаются очень похожими на свои PHP-прообразы.

Оператор If

Вы можете конструировать оператор PHPif при помощи директив PHP@if, PHP@elseif, PHP@else и PHP@endif. Эти директивы работают идентично своим PHP-прообразам:

PHP
@if (count($records) === 1)
  
Здесь есть одна запись!
@elseif (
count($records) > 1)
  
Здесь есть много записей!
@else
  
Здесь нет записей!
@endif

Для удобства Blade предоставляет и директиву PHP@unless:

PHP
@unless (Auth::check())
    
Вы не вошли в систему.
@
endunless
+ 5.2

добавлено в 5.2 ()

Также вы можете определить, есть ли содержимое в данной секции макета, с помощью директивы PHP@hasSection:

PHP
<title>
  @
hasSection ('title')
    @yield(
'title') - Название приложения
  
@else
    
Название приложения
  
@endif
</
title>

Циклы

В дополнение к условным операторам Blade предоставляет простые директивы для работы с поддерживаемыми в PHP конструкциями циклов. Данные директивы тоже идентичны их PHP-прообразам:

PHP
@for ($i 0$i 10$i++)
  
Текущее значение: {{ $i }}
@endfor

@foreach (
$users as $user)
  <
p>Это пользователь {{ $user->id }}</p>
@endforeach

@
forelse($users as $user)
  <
li>{{ $user->name }}</li>
@empty
  <
p>Нет пользователей</p>
@
endforelse

@while (true)
  <
p>Это будет длиться вечно.</p>
@endwhile
+ 5.2

добавлено в 5.2 ()

При работе с циклами может потребоваться закончить цикл или пропустить текущую итерацию:

PHP
@foreach ($users as $user)
  @if (
$user->type == 1)
    @continue
  @endif

  <
li>{{ $user->name }}</li>

  @if (
$user->number == 5)
    @break
  @endif
@endforeach

Также можно включить условие в строку объявления директивы:

PHP
@foreach ($users as $user)
  @continue(
$user->type == 1)

  <
li>{{ $user->name }}</li>

  @break(
$user->number == 5)
@endforeach

Включение подшаблонов

Blade-директива @include позволяет вам легко включать Blade-представление в существующее представление. Все переменные, доступные родительскому представлению, будут доступны и включаемому представлению:

PHP
<div>
  @include(
'shared.errors')

  <
form>
    <!-- 
Содержимое формы -->
  </
form>
</
div>

Хотя включаемое представление унаследует все данные, доступные родительскому представлению, вы также можете передать в него массив дополнительных данных:

PHP
@include('view.name', ['some' => 'data'])

Вам следует избегать использования констант __DIR__ и __FILE__ в ваших Blade-представлениях, поскольку они будут ссылаться на расположение кешированных представлений.

Отрисовка представлений для коллекций

Вы можете комбинировать циклы и включения в одной строке при помощи Blade-директивы @each:

PHP
@each('view.name'$jobs'job')

Первый аргумент — часть представления, которую надо отрисовать для каждого элемента массива или коллекции. Второй аргумент — массив или коллекция для перебора, а третий — имя переменной, которое будет назначено для текущей итерации в представлении. Например, если вы перебираете массив jobs, то скорее всего захотите обращаться к каждому элементу как к переменной job внутри вашей части представления. Ключ для текущей итерации будет доступен в виде переменной key в вашей части представления.

Вы также можете передать четвёртый аргумент в директиву @each. Этот аргумент определяет представление, которое будет отрисовано, если данный массив пуст.

PHP
@each('view.name'$jobs'job''view.empty')

Комментарии

Blade позволяет добавлять комментарии в ваши представления. Но в отличие от HTML-комментариев, Blade-комментарии не попадают в HTML, возвращаемый вашим приложением:

PHP
{{-- Этот комментарий не будет включён в сгенерированный HTML --}}
+ 5.2

добавлено в 5.2 ()

Стеки

Blade позволяет использовать именованные стеки, которые могут быть отрисованы где-нибудь ещё в другом представлении или макете:

PHP
@push('scripts')
  <
script src="/example.js"></script>
@endpush

«Пушить» в один стек можно сколько угодно раз. Для отрисовки стека используйте синтаксис PHP@stack:

PHP
<head>
  <!-- 
Содержимое заголовка -->

  @
stack('scripts')
</
head>

Внедрение сервисов

Директива @inject служит для извлечения сервиса из сервис-контейнера Laravel. Первый аргумент, передаваемый в @inject, это имя переменной, в которую будет помещён сервис. А второй аргумент — имя класса/интерфейса сервиса, который вы хотите извлечь:

PHP
@inject('metrics''App\Services\MetricsService')

<
div>
  
Месячный доход: {{ $metrics->monthlyRevenue() }}.
</
div>

Наследование Blade

Blade позволяет вам определять даже свои собственные директивы. Для этого используется метод PHPdirective(). Когда компилятор Blade встречает директиву, он вызывает предоставленный обратный вызов с его параметром.

Следующий пример создаёт директиву @datetime($var), которая форматирует данный $var

PHP
<?php

namespace App\Providers;

use 
Blade;
use 
Illuminate\Support\ServiceProvider;

class 
AppServiceProvider extends ServiceProvider
{
  
/**
   * Выполнение после-регистрационной загрузки сервисов.
   *
   * @return void
   */
  
public function boot()
  {
    
Blade::directive('datetime', function($expression) {
      return 
"<?php echo with($expression)->format('m/d/Y H:i'); ?>";
    });
  }

  
/**
   * Регистрация привязок в контейнере.
   *
   * @return void
   */
  
public function register()
  {
    
//
  
}
}

Как видите, в этой директиве была использована вспомогательная функция Laravel PHPwith(). Функция PHPwith() просто возвращает данный ей объект/значение, обеспечивая удобную сцепку методов. Финальный PHP-код, сгенерированный этой директивой, будет таким:

PHP
<?php echo with($var)->format('m/d/Y H:i'); ?>
+ 5.2

добавлено в 5.2 ()

После изменения логики директивы Blade вам надо удалить все кешированные представления Blade. Это можно сделать Artisan-командой shview:clear.

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.