Версия фреймворка: 5.4 4.2

Шаблоны

Сборка шаблонов в контроллере

Один из способов компоновки шаблонов в 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);
});