Шаблоны
11.x
.
Почему это важно?
Сборка шаблонов в контроллере
Один из способов компоновки шаблонов в Laravel – использовать сборщик шаблонов контроллера. Если в классе контроллера определить свойство layout
, то указанный шаблон будет создан автоматически и будет использоваться при генерации ответа клиенту.
Использование сборки шаблонов в контроллере
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
.
Создание шаблона Blade
<!-- Расположен в app/views/layouts/master.blade.php -->
<html>
<body>
@section('sidebar')
Это - главная боковая панель.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
Использование шаблона Blade
@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() }}}.
Вывод переменной с проверкой на существование
Иногда вам нужно вывести переменную, которая может быть определена, а может быть нет. Например:
{{{ isset($name) ? $name : 'Default' }}}
Но вам не обязательно писать тернарный оператор, Blade позволяет записать это короче:
{{{ $name or 'Default' }}}
Вывод текста с фигурными скобками
Если вам нужно вывести текст с фигурными скобками – управляющими символами Blade – вы можете поставить префикс @
:
@{{ Этот текст не будет обрабатываться шаблонизатором Blade }}
Конечно, любой вывод переменных должен быть должен быть безопасным – все управляющие символы (javascript-код) должны быть преобразованы в обычные видимые символы, во избежание разнообразных атак. Blade это делает автоматически, если переменная выводится в тройных скобках:
Hello, {{{ $name }}}.
Если вы хотите отменить это, выводите переменные в двойных скобках, но будьте осторожны и не выводите в них контент, который мог изменить пользователь:
Hello, {{ $name }}.
Директива If
@if (count($records) === 1)
Здесь есть одна запись!
@elseif (count($records) > 1)
Здесь есть много записей!
@else
Здесь нет записей!
@endif
@unless (Auth::check())
Вы не вошли в систему.
@endunless
Циклы
@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
Подшаблоны
@include('view.name')
Вы также можете передать массив переменных во включаемый шаблон:
@include('view.name', array('some'=>'data'))
Перезапись секций
Для того, чтобы переписать секцию целиком, используйте директиву overwrite
:
@extends('list.item.container')
@section('list.item.content')
<p>Это - элемент типа {{ $item->type }}</p>
@overwrite
Строки файлов локализации
@lang('language.line')
@choice('language.line', 1)
Комментарии
{{-- Этот комментарий не будет включён в сгенерированный HTML --}}
Расширение Blade
Blade позволяет создавать свои управляющие структуры. Компилятор Blade располагает двумя хелперами:
createPlainMatcher
используется для директив, не имеющих аргументов, таких, как@endif
и@stop
.createMatcher
используется для директив с аргументами.
Вот, например, код, создающий директиву @datetime($var)
, которая аналогична вызову метода format()
у переменной $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);
});