Наследование шаблонов
Два основных преимущества использования Blade наследование шаблонов
и наследование секций
. Поскольку многие веб-приложения используют один общий макет для разных страниц, удобно определить этот макет как один layout-шаблон
.
Основной шаблон который вызывается из контроллера:
resources/views/index.blade.php@extends('layouts.site')
@section('content')
<h1>Все посты блога</h1>
@endsection
Дочерний шаблон который вызывается из вида выше, командой @extends
:
resources/views/layouts/site.blade.php<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Все посты блога</title>
</head>
<body>
<div class="container">
@yield('content')
</div>
</body>
</html>
Вместо @yield('content')
будет подставлено и отрисовано содержимое секции @section('content')
. Директива @yield
может принимать дефолтное значение в качестве второго аргумента. Это значение отрисовывается, если секция которая должна располагаться на этом месте, не определена:
@yield('content', 'Контент страницы')
Тоже самое с директивой @section
:
@section('content', 'Контент страницы')
Рассмотрим еще один пример, где используем директиву @parent
.
Основной шаблон который вызывается из контроллера:
<html>
<head>
<title>
@yield('title', 'Заголовок по умолчанию')
</title>
</head>
<body>
<div id="content">
@section('content')
<p>Это контент страницы по умолчанию.</p>
@show
</div>
</body>
</html>
И создадим два варианта дочернего шаблона:
@extends('layouts.site')
@section('title', 'Новый заголовок страницы')
@section('content')
<p>Это контент замещает контент по умолчанию.</p>
@endsection
@extends('layouts.site')
@section('title', 'Новый заголовок страницы')
@section('content')
@parent
<p>Это контент дополняет контент по умолчанию.</p>
@endsection
Обратите внимание, в родительском шаблоне вместо мы используем @section
и @show
— что означает окончание секции и вывод содержимого. Другими словами, директивы @yeld
и @show
отвечают за вывод содержимого секции, а директивы @section
и @endsection
только задают содержимое, но ничего не выводят.