Шаблонизатор Blade

Вызов шаблона

Шаблонизатор компилирует файлы с расширением blade.php в код php. Скомпилированные файлы находятся в папке /temp/blade . В режиме debug (отладка) файлы компилируются при каждом запуске, в режиме "продакшн" (debug = false) файлы компилируются один раз. Для повторной компиляции нужно вручную их удалить из папки /temp/blade.

Имя шаблона задаётся без расширения blade.php. Если шаблон располагается в подкаталоге, то слева указывается имя подкаталога, потом точка, потом имя шаблона. Уровней вложенности подкаталогов не ограничено. Например, если шаблон находится по пути:

/view/default/books/petrov/history.blade.php

то имя шаблона 'books.petrov.history'. Так как шаблонизатору blade задан рабочий каталог /view/default, то имя шаблона формируется относительно рабочего каталога.

Пример вызова:

view()->show('main.index', [
    'var1' => 'Value 1',
    'var2' => $value2
]);

Шаблон вызывается на экран методом view()->show($name, $vars = []) объекта класса Aleksmir\Core\View\View . Здесь $name - это имя шаблона, $vars - переменные, которые можно использовать в шаблоне.

Если вы хотите вызвать шаблон без указания язания папки языка , то для вызова шаблона используйте метод route()->view($name, $vars = []) объекта \Aleksmir\Core\Route\Route. Пример вызова шаблона с указанием папки языка:

view()->view('core.main.lang.en.index');

Пример вызова шаблона без указания папки языка:

route()->view('core.main.index');

В первом случае задана папка языка /lang/en и шаблон index.blade.php будет открыт из этой папки. Во втором случае шаблон будет открыт из папки, соответствующей текущему языку. То есть, если основной язык русский, то при выборе английского языка в имя шаблона автоматически подставится '.lang.en', а при выборе русского языка имя шаблона останется неизменным.

Основные директивы

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

<div> {{ $var1 }} </div> , будет выведено <div> Value1 </div>

Внутри {{ }} можно использовать функции языка PHP, доступные глобально. По-умолчанию все содержимое между {{ и }} обрабатывается функцией htmlentities() для предотвращения XSS-атак. Бывают ситуации, когда текст должен быть передан в браузер в чистом необработанном виде. Для этого можно использовать конструкцию {!! ... !!} или @{{ ... }}. Для большого участка кода используется конструкция:

@verbatum
...какой то код
@endverbatum

Шаблоны могут быть вложены друг в друга. Удобней вызывать самый дочерний шаблон, а он будет подгружать родительский. Количество уровней родителей не ограничено. Команда для загрузки родительского шаблона:

@extends('parent')

Здесь 'parent' - имя родительского шаблона.

Из дочернего шаблона в родительский можно вставить секцию, при этом в родительском шаблоне нужно указать:

@yield('sect_name')

Здесь 'sect_name' - имя секции. В дочернем шаблоне нужно создать содержимое секции:

@section('sect_name')
... содержимое секции дочернего шаблона
@endsection

Если в родительском шаблоне явно указана секция:

@section('sect_name')
...содержимое секции родительского шаблона
@endsection

то в дочернем шаблоне с помощью директивы можно вставить это содержимое и даже дополнить его новым содержимым. Пример секции дочернего шаблона:

@section('sect_name')
@parent
...содержимое дочернего шаблона
@endsection

Ещё один оператор для вставки другого шаблона: @include($name, $var = []) ,
здесь $name - имя вставляемого шаблона, $var - именованный массив со списком параметров.

Условия

Директива условия @if...@endif :

@if (условие)
...
@elseif
...
@elseif
...
@else
...
@endif

Директива "если не" @unless :

@unless (условие)
...
@endif

Сокращенная условная директива: вместо {{ isset($var) ? $var : 'no value' }} можно использовать: {{ isset($var) or 'no value' }}

Директива @hasSection('name') позволяет определить - если ли в дочернем шаблоне секция 'name':

@hasSection('sect_name')
...
@else
...
@endif

Циклы

Директивы цикла @for , @while , @each :

@for ($item = 0; $item < 5; $item++)
{{ $item }}
@endfor

@foreach($pages as $page)
Страница «{{ $page->title }}»
@endforeach

@forelse($lines as $line)
Строка {{ $line }}
@empty
Список пуст
@endforelse

@while (условие)
...
@endwhile

@each('parent', $array, 'var_name', ['parent_empty'])

Здесь 'parent' - имя шаблона, который будет повторяться для каждого элемента массива $array, при этом, в шаблон будет подставляться значение текущего элемента, доступного из шаблона в переменной с именем 'var_name'. Шаблон 'parent_empty' является не обязательным, он будет выведен на экран, если массив $array пуст.

Внутри цикла директива @continue([условие]) - пропускает текущую итерацию, @break([условие]) - прерывает цикл. Условие в этих директивах не является обязательным. Если условие не задано, то пропуск или прерывание происходят без условий.

Внутри цикла также доступна переменная $loop:

$loop->index - индекс текущей итерации (начинается с 0)
$loop->iteration - текущая итерация (начинается с 1)
$loop->remaining - число оставшихся итераций цикла
$loop->count - общее число итераций
$loop->first - признак первой итерации
$loop->last - признак последней итерации
$loop->depth - уровень вложенности текущего цикла
$loop->parent - переменная $loop родительского цикла

Другие полезные директивы

Комментарии в шаблоне blade:
{{-- Этот комментарий не отобразится в итоговом HTML --}}

Директива @php позволяет вставить в шаблон любой произвольный участок кода на языке PHP:

@php
...какой-то код PHP
@endphp

Именованные стеки . В шаблоне можно вставлять код в именованный стек, например:

@push('scripts')
<script src="/script.js"></script>
@endpush

В другом шаблоне можно этот стек отобразить:

<head>
@stack('scripts')
</head>

Создание собственных директив

Создание возможно, благодаря методу directive объекта класса eftec\bladeone\BladeOne:

view()->blade->directive('name', function($param) {
    ... код функции
});

Здесь 'name' - имя директивы, $param - входные параметры директивы.