По умолчанию, laravel работает с шаблонизатором blade. Шаблоны создаются в папке app/views и имеют расширение blade.php. Шаблоны подключаются в экшне через хелпер view(), входящим параметром в который передается имя шаблона без расширения blade.php.
Сперва создадим в папке view папку layouts для хранения базовых шаблонов. В папке layouts создадим файл defaults.blade.php
Базовый шаблон defaults.blade.php. |
@include('layouts.header') <div class="container">
<div class="masthead"> <h3 class="text-muted">Project name</h3> <ul class="nav nav-justified"> <li class="active"><a href="#">Home</a></li> --блок ссылок -- </ul> </div> @yield('content') <!-- Site footer --> <div class="footer"> <p>© Company 2014</p> </div> </div><!-- /container --> @include('layouts.footer') |
В файлах layouts/header.blade.php и layouts/footer.blade.php находится обычный html-код для шапки и футера сайта. Эти 3 файла – это неизменная часть шаблона.
@yield(‘content’) – вывод переменной content. Саму переменную определим в меняющейся части шаблона.
Меняющуюся часть шаблона вынесем в отдельный файл index.blade.php.
Меняющаяся часть шаблона. |
@extends('layouts.default') @section('content') <h1>Добро пожаловать на сайт</h1> <div>Текст на страницу</div> @stop |
Если необходимо создать часть кода в шаблоне, которая в последствии будет либо заменена, либо добавлена, то можно воспользоваться дирректировой @show
Объявление переменной с диррективой @show в базовом шаблоне. |
@section('styles') <link href="{{ asset('/css/bootstrap.css') }}"> @show |
Далее к данному стилю можно добавить другие стили в файлах подшаблона. В подшаблоне обращаемся к диррективе @parent переменной styles.
Объявление переменной с диррективой @show в базовом шаблоне. |
@extends('public') @section('styles') @parent <linkhref="{{ asset('/js/fancybox/jquery.fancybox.css') }}"> @stop |
Обратите внимание на @extends в начале кода. В шаблонизаторе blade из контроллера мы обращаемся к подшаблону, а подшаблон с помощью диррективы @extends сам себя вставляет в базовый шаблон public.
Подключение подшаблона index.blade.php осуществляется в экшне контроллера.
Подключение подшаблона index.blade.php. |
return view('index'); |
Передача массива в шаблон:
Передача массива в шаблон. |
$posts = array(1=>’One’, 2=>’Two’); return view('index', $posts); |
Имеется также ещё один способ передачи переменных в шаблон, через метод with():
Передача переменной в шаблон с помощью метода with. |
$posts = array(1=>’One’, 2=>’Two’); return view(‘index’)->with(‘posts’, $posts) |
Если вы не уверены в существовании передаваемой переменной, то нужно использовать with(), тогда не будет выводиться ошибка.
И ещё один способ передачи переменных:
Магический метод передачи данных в шаблон. |
$view = view('greeting')->withName('Victoria'); |
Для вывода переменных в шаблоне можно воспользоваться диррективой {{}}
Вывод переменных шаблона. |
{{$name}} // простой вывод переменной {{isset($name)?$name:'Default'}} // вывод либо переменной либо значения по умолчанию. {{ $name or 'Default' }}// еще один способ вывода значения по умолчанию |
Для предотвращения XSS-атак дирректива {{}} экранирует html-тэги. Если всё же необходимо вывести html, то можно воспользоваться другой дирректовой:
Дирректива {!! !!}. |
|
Вывод всех элементов массива на экран
Вывод элементов массива на экран. |
@if($posts->count()) @foreach($posts as $post) <div>{{$post }}</div> @endforeach @endif |
Проверка шаблона на существование
Проверить существует ли шаблон по заданному пути, можно с помощью хелпера view() и метода exists(), входящим параметром в который передается путь к шаблону.
Проверка шаблона на существование. |
if (view()->exists('templates.base')) { // шаблон существует }else{ // шаблон не существует } |
Передача данных во все шаблоны
Для передачи переменных во все шаблоны, можно воспользоваться либо хелпером view():
Передача данных во все шаблоны с помощью хелперов. |
view()->share('data', [1, 2, 3]); |
либо фасадом:
Передача данных во все шаблоны с помощью фасадов. |
View::share('data', [1, 2, 3]); |
Этот код можно положить в метод boot() сервис-провайдера общего сервис-провайдера приложения AppServiceProvider или своего собственного.
View composer
Композеры (view composers) - функции-замыкания или методы класса, которые вызываются, когда шаблон рендерится в строку. Если у вас есть данные, которые вы хотите привязать к шаблону при каждом его рендеринге, то композеры помогут вам выделить такую логику в отдельное место.
Регистрировать композеры можно внутри сервис-провайдера. Мы будем использовать фасад View для того, чтобы получить доступ к имплементации контракта Illuminate\Contracts\View\Factory:
Определение композера. |
<?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
Регистрация файла композера. |
'App\Providers\ComposerServiceProvider', |
Определение класса SiteComposer:
Класс SiteComposer. |
<?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().
Назначение композера для нескольких шаблонов
Вместо имени шаблона можно использовать массив имен.
Назначение композера для нескольких шаблонов. |
View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer'); |
Композер для всех шаблонов
А вот так можно назначить композер для всех шаблонов:
Назначение композера для всех шаблонов. |
View::composer('*', function() { // }); |
Регистрация нескольких шаблонов
Можно использовать метод composers, чтобы зарегистрировать несколько композеров одновременно:
Регистрация нескольких шаблонов одновременно. |
View::composers([ 'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'], 'App\Http\ViewComposers\UserComposer' => 'user', 'App\Http\ViewComposers\ProductComposer' => 'product' ]); |
ViewCreator
Создатели шаблонов работают почти так же, как композеры, но вызываются сразу после создания объекта шаблона, а не во время его рендеринга в строку. Для регистрации используйте метод creator:
Регистрация view creator. |
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator'); |
Практика