Шаблоны контроллеров
Один из способов использования шаблонов в Laravel — в виде шаблонов контроллеров. Если в классе контроллера определить свойство PHPlayout
, то указанный шаблон будет создан автоматически и будет использоваться при генерации ответа клиенту.
Определение шаблона контроллера
class UserController extends BaseController {
/**
* Шаблон, который должен использоваться при ответе.
*/
protected $layout = 'layouts.master';
/**
* Отображает профиль пользователя.
*/
public function showProfile()
{
$this->layout->content = View::make('user.profile');
}
}
Шаблоны Blade
Blade — простой, но мощный шаблонизатор, входящий в состав Laravel. В отличии от шаблонов контроллеров, Blade основан на концепции наследования шаблонов и секциях. Все шаблоны Blade должны иметь расширение .blade.php.
xml<!-- Расположен в app/views/layouts/master.blade.php --> <html> <body> @section('sidebar') Это - главная боковая панель. @show <div class="container"> @yield('content') </div> </body> </html>
xml@extends('layouts.master') @section('sidebar') @parent <p>Этот элемент будет добавлен к главной боковой панели.</p> @stop @section('content') <p>Это - содержимое страницы.</p> @stop
Заметьте, что шаблоны, которые расширяют другой Blade-шаблон с помощью @extend, просто перекрывают секции последнего. Старое (перекрытое) содержимое может быть выведено директивой @parent.
Иногда — например, когда вы не уверены, что секция была определена — вам может понадобиться указать значение по умолчанию для директивы @yield. Вы можете передать его вторым аргументом:
@yield('section', 'Default Content');
Другие директивы Blade
Вывод переменных
Привет, {{ $name }}.
Текущее время эпохи UNIX: {{ time() }}.
добавлено в 4.1 ()
Вывод переменных после проверки на существование
Иногда вам надо вывести значение переменной, но вы не уверены, задано ли оно. То есть вы хотите сделать так:
{{{ isset($name) ? $name : 'Default' }}}
Вместо написания тройного оператора Blade позволяет вам использовать такое удобное сокращение:
{{{ $name or 'Default' }}}
Вывод сырого текста в фигурных скобках
Если вам нужно вывести строку в фигурных скобках, вы можете отменить её обработку с помощью Blade, поставив перед текстом символ @:
@{{ Это не будет обработано с помощью Blade }}
Конечно, весь пользовательский ввод должен быть экранирован или очищен. Для экранирования используйте тройные скобки:
Привет, {{{ $name }}}.
добавлено в 4.1 ()
Внимание: будьте очень осторожны и экранируйте переменные, которые содержат ввод от пользователя. Всегда используйте тройные скобки, чтобы преобразовать HTML-сущности в переменной в текст.
Как показывает практика, вместо экранирования только пользовательских переменных безопаснее экранировать весь вывод, делая исключения только в редких случаях — прим. пер.
Директива If
xml@if (count($records) === 1) <p>Здесь есть одна запись!</p> @elseif (count($records) > 1) <p>Здесь есть много записей!</p> @else <p>Здесь нет записей!</p> @endif @unless (Auth::check()) <p>Вы не вошли в систему.</p> @endunless
Циклы
xml@for ($i = 0; $i < 10; $i++) <p>Текущее значение: {{ $i }}</p> @endfor @foreach ($users as $user) <p>Это пользователь {{ $user->id }}</p> @endforeach @while (true) <p>Это будет длиться вечно.</p> @endwhile
добавлено в 4.2 ()
xml@forelse($users as $user) <li>{{ $user->name }}</li> @empty <p>Нет пользователей</p> @endforelse
Подшаблоны
@include('view.name')
Вы также можете передать массив переменных во включаемый шаблон:
@include('view.name', array('some'=>'data'))
Перезапись секций
Для полной перезаписи можно использовать директиву @overwrite.
xml@extends('list.item.container') @section('list.item.content') <p>Это - элемент типа {{ $item->type }}</p> @overwrite
Языковые строки
@lang('language.line')
@choice('language.line', 1);
Комментарии
{{-- Этот комментарий не будет включён в сгенерированный HTML --}}
добавлено в 4.1 ()
Расширение Blade
Blade позволяет вам определять даже собственные управляющие структуры. После компилирования файла Blade вызывается каждое пользовательское расширение с содержимым представления, это позволяет использовать и такие простые манипуляции как PHPstr_replace
, и более сложные регулярные выражения.
В компилятор Blade входят вспомогательные методы PHPcreateMatcher()
и PHPcreatePlainMatcher()
, которые генерируют выражение, необходимое для создания ваших собственных директив.
Метод PHPcreatePlainMatcher()
используется для директив без аргументов, таких как PHP@endif
и PHP@stop
, а метод PHPcreateMatcher()
— для директив с аргументами.
Следующий пример создаёт директиву PHP@datetime($var)
, которая просто вызывает PHP->format()
для PHP$var
:
Blade::extend(function($view, $compiler)
{
$pattern = $compiler->createMatcher('datetime');
return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\'); ?>', $view);
});