Директива yield
Директива yield применяется в файлах шаблонов Blade
для вывода содержимого секции, которая была определена
с помощью директивы section в дочерних шаблонах.
Первым параметром передаётся имя секции, вторым - значение
по умолчанию, которое будет выведено, если секция не определена.
Синтаксис
@yield('section_name')
@yield('section_name', 'default content')
Пример
Давайте создадим базовый шаблон, который определяет область для вывода контента:
<html>
<head>
<title>@yield('title', 'Default Title')</title>
</head>
<body>
<div class="header">
@yield('header')
</div>
<div class="content">
@yield('content')
</div>
<div class="footer">
@yield('footer', 'Default Footer')
</div>
</body>
</html>
В этом примере базовый шаблон содержит три области вывода.
Для секций title и footer заданы значения
по умолчанию, которые будут использованы, если дочерний
шаблон не определит эти секции.
Пример
Теперь создадим дочерний шаблон, который расширяет базовый и определяет некоторые секции:
@extends('base')
@section('title', 'Custom Page Title')
@section('header')
<h1>Custom Header</h1>
@endsection
@section('content')
<p>This is the main content of the page.</p>
<p>It will be displayed in the content area.</p>
@endsection
В дочернем шаблоне мы переопределили все три секции.
Секция title задана сокращённым способом, а секции
header и content - блочным. При рендеринге
этого шаблона будет использован кастомный заголовок страницы,
кастомный хедер и основной контент.
Результат выполнения кода:
<html>
<head>
<title>Custom Page Title</title>
</head>
<body>
<div class="header">
<h1>Custom Header</h1>
</div>
<div class="content">
<p>This is the main content of the page.</p>
<p>It will be displayed in the content area.</p>
</div>
<div class="footer">
Default Footer
</div>
</body>
</html>
Как видно из результата, секция footer не была определена
в дочернем шаблоне, поэтому использовалось значение по умолчанию,
заданное в директиве yield.
Пример
Давайте создадим контроллер, который будет рендерить наш дочерний шаблон:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
class PageController extends Controller
{
public function show()
{
return view('child');
}
}
?>
Теперь при обращении к этому контроллеру будет отрендерен
дочерний шаблон, который использует базовый шаблон с директивами
yield. Все секции, определённые в дочернем шаблоне,
будут подставлены в соответствующие места базового шаблона.
Результат выполнения кода:
<html>
<head>
<title>Custom Page Title</title>
</head>
<body>
<div class="header">
<h1>Custom Header</h1>
</div>
<div class="content">
<p>This is the main content of the page.</p>
<p>It will be displayed in the content area.</p>
</div>
<div class="footer">
Default Footer
</div>
</body>
</html>
Таким образом, директива yield позволяет создавать
гибкие шаблоны с возможностью переопределения отдельных
частей контента в дочерних представлениях.