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

Blade - расширенные шаблоны

перевод

  1. 1. Основы
  2. 2. Логика
  3. 3. Группы шаблонов

Встроенная в Laravel система шаблонов «Blade» даёт вам возможность использовать красивый синтаксис для вставки PHP кода. Он также содержит набор функций для быстрого выполнения часто используемых задач. Шаблоны Blade кэшируются, поэтому они очень быстры в работе.

Как обычно, давайте начнём без длинных предисловий.

Основы

Чтобы включить Blade для своего шаблона просто добавьте к нему расширение .blade.php вместо обычного .php. Больше ничего не требуется.

Обычно, когда используя шаблоны в обычных фреймворках на PHP вы часто делаете так:

PHP
<?php echo $val?>

Короткие теги PHP (short_tags) немного облегчают написание:

PHP
<?=$val?>

Однако всё равно остаётся, что можно улучшать. Посмотрим, как это выглядит в Blade

PHP
{{ $val }}

Красиво! Пробелы внутри скобок не обязательны, но мне с ними нравится больше. Содержимое фигурных скобок вычисляется и выводится с помощью echo. Вы можете использовать любой PHP-код^

PHP
{{ time() }}

Пример выше тоже будет работать. Всё, что делает Blade в данном случае — просто трансформирует PHP{{ $val }} в PHP<?php echo $val?> — помните об этом, если у вас возникают проблемы.

Логика

Как насчёт циклов вроде foreach — ведь они нам очень часто нужны, точно так же как if и else? Blade упрощает использование этих конструкций с помощью «магического значка» @. Например:

PHP
@foreach ($users as $user)
  <
div class="user">{{ $user->name }}</div>
@endforeach

Ну вот, оно не только выглядит лучше без всех этих ужасных PHP-тегов, но и быстрее для ввода. Как насчёт if и elseif? Для них просто замените <?php на @, а закрывающие ; ?> — опустите. Вот что у нас останется:

PHP
@if ($user->name == 'Dave')
  <
p>ПриветДейв!</p>
@else
  <
p>Приветгость!</p>
@endif

Вот ещё операторы, которые поддерживает Blade — они вам тоже знакомы:

PHP
@for ($i =0$i 100 1$i++)
  
Номер №{{ $i }}<br />
@endfor

А также:

PHP
@forelse ($users as $user)
  {{ 
$user->name }}
@empty
  <
p>Пользователей не найдено..</p>
@
endforelse

Последний пример несколько необычен — это цикл foreach с добавленным @empty, который выводит своё содержимое, если переданный массив пустой. Это удобная конструкция, с ней нам не требуется писать лишний if.

Группы шаблонов

Blade позволяет создавать сложные вложенные шаблоны. С его чистым синтаксисом это может быть одной из лучших реализаций — но вам нужно начать использовать это самим, чтобы понять, насколько это удобно. Создадим первичный шаблон и назовём его template.blade.php:

<!DOCTYPE html>
<html lang="en-GB">
  <head>
    <meta charset="UTF-8">
    <title>@yield('title')</title>
  </head>
  <body>
    <div class="header">
      <ul>
        @section('navigation')
          <li><a href="#">Главная</a></li>
          <li><a href="#">Блог</a></li>
        @yield_section
      </ul>
    </div>

    @yield('content')

  </body>
</html>

Этот шаблон использует метод @yield для задания места содержимого страницы — оно может быть заполнено другим шаблоном, использующим этот. Для этого передайте в первичный шаблон (тот, что выше) соответствующую строку.

Методы @section и @yield_section определяют регион, который изначально содержит какие-то данные по умолчанию, но может быть заменён (перекрыт) другими данными из используемого шаблона.

Теперь посмотрим на другой шаблон — page.blade.php — который использует только что созданный первичный шаблон:

xml@layout('template')

@section('title')
  Домашняя страничка Дейла.
@endsection

@section('navigation')
  @parent
  <li><a href="#">Обо мне</a></li>
@endsection

@section('content')
  <h1>Привет!</h1>
  <p>Добро пожаловать на мою домашнюю страничку!</p>
@endsection

Здесь мы используем метод @layout для указания шаблона template как родительского («layout»). Затем мы используем @section и @endsection для замещения вызовов @yield и @yield_section в соответствующих местах первичного шаблона.

В секции navigation вы можете заметить вызов @parentBlade заменит его на содержимое родительского шаблона, которое мы перекрыли с помощью @section.

Если мы отформатируем такую страницу в каком-то из наших маршрутов или действий:

PHP
return View::make('page');

...то получим полноценную страницу, обёрнутую в шаблон @layout (template):

<!DOCTYPE html>
<html lang="en-GB">
  <head>
    <meta charset="UTF-8">
    <title>Домашняя страничка Дейла.</title>
  </head>
  <body>
    <div class="header">
      <ul>
        <li><a href="#">Главная</a></li>
        <li><a href="#">Блог</a></li>
        <li><a href="#">Обо мне</a></li>
      </ul>
    </div>

    <h1>Привет!</h1>
    <p>Добро пожаловать на мою домашнюю страничку!</p>
  </body>
</html>

Отлично! Мы можем использовать любое число шаблонов, которое нам нужно — ведь они обычные шаблоны Blade.

А как передать содержимое для @section из нашего маршрута или действия? Для этого просто вызовем меод PHPSection::inject() («вставить») и передадим ему имя шаблона и содержимое секции.

PHP
Route::get('/', array('do' => function () {
  
Section::inject('title''Мой сайт');
  return 
View::make('page');
}));

Вот и всё! Теперь вы знаете, как использовать Blade, чтобы сделать свои шаблоны простыми и эффективными. Дизайнеры будут вас любить за это.

В статье не упомянута ещё одна полезная функция — render_each. Она принимает массив (например, строк в результате выполнения запроса к БД) и вызывает нужный шаблон для каждого элемента. Например: PHP{{ render_each('table'$rows'row''Строк нет.') }}прим. пер.

Если вы столкнулись с ошибкой PHP **Fatal error: Method Laravel\View::__toString() must not throw an exception.** — проверьте файл шаблона на наличие ошибок и непойманных исключений. Это происходит из-за того, что в текущей версии Laravel (3.1 и ниже) Blade форматирует шаблон в «ленивом» режиме, когда он преобразуется в строку, и если в этот момент возникает ошибка PHP прерывает выполнение, так как ((http://www.php.net/manual/ru/language.oop5.magic.php#object.tostring __toString)) всегда должен завершаться успешно. — прим. пер.

Как вы считаете, полезен ли этот материал? Да Нет

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

Разметка: ? ?

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