Публикация на тему
Использование элементов представления в шаблоне проектирования HMVC фрэймворка Laravel
Автор
Михалькевич Александр Викторович
Наименование Шаблонизатор blade
Автор А.В.Михалькевич
Специальность Использование элементов представления в шаблоне проектирования HMVC фрэймворка Laravel ,
Анотация
Anotation in English
Ключевые слова
Количество символов 17299
По умолчанию, laravel работает с шаблонизатором blade. Шаблоны создаются в папке app/views и имеют расширение blade.php. Шаблоны подключаются в экшне через хелпер view(), входящим параметром в который передается имя шаблона без расширения blade.php.
Сперва создадим в папке view папку layouts для хранения базовых шаблонов. В папке layouts создадим файл defaults.blade.php.
Базовый шаблон defaults.blade.php. Листинг 1.1 |
@include('layouts.header')
Project name
--блок ссылок --
@yield('content')
© Company 2014
@include('layouts.footer') |
В файлах layouts/header.blade.php и layouts/footer.blade.php находится обычный html-код для шапки и футера сайта. Эти 3 файла – это неизменная часть шаблона.
@yield(‘content’) – вывод переменной content. Саму переменную определим в меняющейся части шаблона.
Меняющуюся часть шаблона вынесем в отдельный файл index.blade.php.
Меняющаяся часть шаблона. Листинг 1.2 |
@extends('layouts.default') @section('content')
Добро пожаловать на сайт
Текст на страницу
@stop |
Если необходимо создать часть кода в шаблоне, которая в последствии будет либо заменена, либо добавлена, то можно воспользоваться дирректировой @show
@show
Объявление переменной с диррективой @show в базовом шаблоне. Листинг 1.3 |
@section('styles')
|
Далее к данному стилю можно добавить другие стили в файлах подшаблона. В подшаблоне обращаемся к диррективе @parent переменной styles.
Объявление переменной с диррективой @show в базовом шаблоне. Листинг 1.4 |
@extends('public') @section('styles') @parent
@stop |
Обратите внимание на @extends в начале кода. В шаблонизаторе blade из контроллера мы обращаемся к подшаблону, а подшаблон с помощью диррективы @extends сам себя вставляет в базовый шаблон public.
Подключение подшаблона index.blade.php осуществляется в экшне контроллера.
Подключение подшаблона index.blade.php. Листинг 1.5 |
return view('index'); |
Передача массива в шаблон:
Передача массива в шаблон. Листинг 1.6 |
$posts = array(1=>’One’, 2=>’Two’); return view('index', $posts); |
Имеется также ещё один способ передачи переменных в шаблон, через метод with():
Передача переменной в шаблон с помощью метода with. Листинг 1.7 |
$posts = array(1=>’One’, 2=>’Two’); return view(‘index’)->with(‘posts’, $posts) |
Если вы не уверены в существовании передаваемой переменной, то нужно использовать with(), тогда не будет выводиться ошибка.
И ещё один способ передачи переменных:
Магический метод передачи данных в шаблон. Листинг 1.8 |
$view = view('greeting')->withName('Victoria'); |
Для вывода переменных в шаблоне можно воспользоваться диррективой {{}}
Вывод переменных шаблона. Листинг 1.9 |
{{$name}} // простой вывод переменной {{isset($name)?$name:'Default'}} // вывод либо переменной либо значения по умолчанию. {{ $name or 'Default' }}// еще один способ вывода значения по умолчанию |
Для предотвращения XSS-атак дирректива {{}} экранирует html-тэги. Если всё же необходимо вывести html, то можно воспользоваться другой дирректовой:
Дирректива {!! !!}. Листинг 1.10 |
|
Вывод всех элементов массива на экран
Вывод элементов массива на экран. Листинг 1.11 |
@if($posts->count()) @foreach($posts as $post)
{{$post }}
@endforeach @endif |
Проверить существует ли шаблон по заданному пути, можно с помощью хелпера view() и метода exists(), входящим параметром в который передается путь к шаблону.
Проверка шаблона на существование. Листинг 2.1 |
if (view()->exists('templates.base')) { // шаблон существует }else{ // шаблон не существует } |
Композеры (view composers) - функции-замыкания или методы класса, которые вызываются, когда шаблон рендерится в строку. Если имеются данные, которые необходимо привязать к шаблону при каждом его рендеринге, то композеры помогут вам выделить такую логику в отдельное место.
Регистрировать композеры можно внутри сервис-провайдера. Мы будем использовать фасад View для того, чтобы получить доступ к имплементации контракта Illuminate\Contracts\View\Factory:
Определение композера. Листинг 3.1 |
<?php namespace App\Providers; use View; use Illuminate\Support\ServiceProvider; use App\Http\ViewComposers\SiteComposer; class ComposerServiceProvider extends ServiceProvider { public function boot() { View::composer('*', 'App\Http\ViewComposers\SiteComposer'); } public function register() { // } } |
Файл композера необходимо зарегистрировать в config/app.php
Регистрация файла композера. Листинг 3.2 |
'App\Providers\ComposerServiceProvider', |
Определение класса SiteComposer:
Класс SiteComposer. Листинг 3.3 |
<?php namespace App\Http\ViewComposers; use Illuminate\Contracts\View\View; class SiteComposer { public function compose(View $view) { $view->with('menu_items',’TEST’); } } |
Метод compose должен получать в качестве аргумента инстанс Illuminate\Contracts\View\View. Для передачи переменных в шаблон используйте метод with().
Назначение композера для нескольких шаблонов
Вместо имени шаблона можно использовать массив имен.
Назначение композера для нескольких шаблонов. Листинг 3.4 |
View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer'); |
Композер для всех шаблонов
А вот так можно назначить композер для всех шаблонов:
Назначение композера для всех шаблонов. Листинг 3.5 |
View::composer('*', function() { // }); |
Регистрация нескольких шаблонов
Можно использовать метод composers, чтобы зарегистрировать несколько композеров одновременно:
Регистрация нескольких шаблонов одновременно. Листинг 3.5 |
View::composers([ 'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'], 'App\Http\ViewComposers\UserComposer' => 'user', 'App\Http\ViewComposers\ProductComposer' => 'product' ]); |