{{TOC}} Встроенная в Laravel система шаблонов "Blade" даёт вам возможность использовать красивый синтаксис для вставки PHP кода. Он также содержит набор функций для быстрого выполнения часто используемых задач. Шаблоны //Blade// кэшируются, поэтому они очень быстры в работе. Как обычно, давайте начнём без длинных предисловий. == Основы == Чтобы включить //Blade// для своего шаблона просто добавьте к нему расширение **.blade.php** вместо обычного **.php**. Больше ничего не требуется. Обычно, когда используя шаблоны в обычных фреймворках на PHP вы часто делаете так: %% %% Короткие теги PHP (**short_tags**) немного облегчают написание: %% %% Однако всё равно остаётся, что можно улучшать. Посмотрим, как это выглядит в //Blade// %% {{ $val }} %% Красиво! Пробелы внутри скобок не обязательны, но мне с ними нравится больше. Содержимое фигурных скобок вычисляется и выводится с помощью **echo**. Вы можете использовать любой PHP-код^ %% {{ 5 * time() }} %% Пример выше тоже будет работать. Всё, что делает //Blade// в данном случае - просто трансформирует %%{{ $val }}%% в %%%% - помните об этом, если у вас возникают проблемы. == Логика == Как насчёт циклов вроде **foreach** - ведь они нам очень часто нужны, точно так же как **if** и **else**? //Blade// упрощает использование этих конструкций с помощью "магического значка" %%(t)@%%. Например: %% @foreach ($users as $user)
{{ $user->name }}
@endforeach %% Ну вот, оно не только выглядит лучше без всех этих ужасных PHP-тегов, но и быстрее для ввода. Как насчёт **if** и **elseif**? Для них просто замените %%(t)%% - опустите. Вот что у нас останется: %% @if ($user->name == 'Dave')

Привет, Дейв!

@else

Привет, гость!

@endif %% Вот ещё операторы, которые поддерживает Blade - они вам тоже знакомы: %% @for ($i =0; $i < 100 - 1; $i++) Номер №{{ $i }}
@endfor %% А также: %% @forelse ($users as $user) {{ $user->name }} @empty

Пользователей не найдено..

@endforelse %% Последний пример несколько необычен - это цикл **foreach** с добавленным %%(t)@empty%%, который выводит своё содержимое, если переданный массив пустой. Это удобная конструкция, с ней нам не требуется писать лишний **if**. == Группы шаблонов == //Blade// позволяет создавать сложные вложенные шаблоны. С его чистым синтаксисом это может быть одной из лучших реализаций - но вам нужно начать использовать это самим, чтобы понять, насколько это удобно. Создадим //первичный шаблон// и назовём его %%(t)template.blade.php%%: %%(h) @yield('title')
@yield('content') %% Этот шаблон использует метод **@yield** для задания места содержимого страницы - оно может быть заполнено другим шаблоном, использующим этот. Для этого передайте в //первичный шаблон// (тот, что выше) соответствующую строку. Методы **@section** и **@yield_section** определяют регион, который изначально содержит какие-то данные по умолчанию, но может быть заменён (перекрыт) другими данными из используемого шаблона. Теперь посмотрим на другой шаблон - **page.blade.php** - который использует только что созданный //первичный шаблон//: %%(html) @layout('template') @section('title') Домашняя страничка Дейла. @endsection @section('navigation') @parent
  • Обо мне
  • @endsection @section('content')

    Привет!

    Добро пожаловать на мою домашнюю страничку!

    @endsection %% Здесь мы используем метод **@layout** для указания шаблона %%(t)template%% как родительского ("layout"). Затем мы используем **@section** и **@endsection** для замещения вызовов **@yield** и **@yield_section** в соответствующих местах //первичного шаблона//. В секции **navigation** вы можете заметить вызов **@parent** - //Blade// заменит его на содержимое родительского шаблона, которое мы перекрыли с помощью %%(t)@section%%. Если мы отформатируем такую страницу в каком-то из наших ((док3:routing маршрутов)) или ((док3:controllers#действи+я))й: %% return View::make('page'); %% ...то получим полноценную страницу, обёрнутую в шаблон **@layout** (%%(t) template%%): %%(h) Домашняя страничка Дейла.

    Привет!

    Добро пожаловать на мою домашнюю страничку!

    %% Отлично! Мы можем использовать любое число шаблонов, которое нам нужно - ведь они обычные шаблоны //Blade//. А как передать содержимое для **@section** из нашего ((док3:routing маршрута)) или ((док3:controllers#действия))? Для этого просто вызовем меод %%Section::inject()%% ("вставить") и передадим ему имя шаблона и содержимое секции. %% Route::get('/', array('do' => function () { Section::inject('title', 'Мой сайт'); return View::make('page'); })); %% Вот и всё! Теперь вы знаете, как использовать //Blade//, чтобы сделать свои шаблоны простыми и эффективными. Дизайнеры будут вас любить за это. .(tl_note) В статье не упомянута ещё одна полезная функция - **((док3:views/templating render_each))**. Она принимает массив (например, строк в результате выполнения запроса к БД) и вызывает нужный шаблон для каждого элемента. Например: %%{{ render_each('table', $rows, 'row', 'Строк нет.') }}%% - //прим. пер.// .(tl_note) Если вы столкнулись с ошибкой 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)) всегда должен завершаться успешно. - //прим. пер.//