Laravel - Разница между @yield и @section?
В Laravel docs вы можете включать "разделы" внутри макетов, используя два метода:
<html>
<body>
@section('sidebar')
This is the master sidebar.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
Так как @yield
также может передавать содержимое по умолчанию, используя @yield('section', 'Default Content')
, это @yield
просто сокращение для @section
, которое не использует @parent
?
@section
<!-- Nothing here -->
@show
Какие еще отличия существуют?
Ответы
Ответ 1
Эта строка устраняет путаницу: "Обратите внимание, что представления, расширяющие макет Blade, просто переопределяют разделы из макета. Содержимое макета может быть включено в дочернее представление, используя директиву @parent
в разделе".
Итак, если у вас уже есть @section
, определенный в макете макета, он будет переопределен, если вы не укажете @parent
внутри дочернего макета @section
.
Но для @yield
он всегда получает раздел из дочернего макета. Это означает, что он всегда переопределяет часть @yield
, даже если она имеет значение по умолчанию @yield('section', 'Default Content')
.
Я надеюсь, что это избавит вас от путаницы. Дайте мне знать, если у вас появятся дополнительные вопросы. Благодаря
Ответ 2
Краткий ответ: всегда используйте @yield
если вы не хотите делать что-то более сложное, чем @yield
string
умолчанию.
Длинный ответ: @yield и @section.. @show могут быть перезаписаны при каждом расширении шаблона блейда. Все, что вы можете сделать с @yield, также можно сделать с помощью @section.. @show, но не наоборот. Вот что они делают:
@yield ( 'главной')
- Может быть заменен на @section ('main').. @endsection
- Может содержать строку по умолчанию, но без HTML! Строка по умолчанию будет показана в шаблоне sub-blade, если не задано @section ('main').. @endsection.
@section ('main').. @show
- Может быть заменен на @section ('main').. @endsection
- Может быть предоставлен HTML-код по умолчанию. HTML-код по умолчанию будет показан в шаблоне sub-blade, если не указан @section ('main').
- Может быть заменен на @section ('main') @parent.. @endsection и дополнительно показывает код HTML по умолчанию.
Вот несколько примеров: test.blade.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<h1>This is a test</h1>
@yield('mainA')
@yield('mainB', 'This is the alternative 1')
@yield('mainC', '<p>This is the alternative 2</p>')
@yield('mainD', 'This is the alternative 3')
@section('testA')
@show
@section('testB')
This is the alternative 4
@show
@section('testC')
<p>This is the alternative 5</p>
@show
@section('testD')
<p>This is the alternative 6</p>
@show
</body>
</html>
Вот еще один файл с именем testA.blade.php
который расширяет другой блейд файл:
@extends('test')
@section('mainD')
<div>
<p>First replacement!</p>
<hr>
</div>
@endsection
@section('testC')
<div>
<p>Second replacement!</p>
<hr>
</div>
@endsection
@section('testD')
@parent
<div>
<p>Additional content</p>
<hr>
</div>
@endsection
И это результат:
![enter image description here]()
Ответ 3
В основном yield('content')
- маркер. Например, в теге, если вы положили yield('content')
, ваше высказывание в этом разделе содержит имя содержимого и, кстати, вы можете называть внутри скобки все, что угодно. он не должен быть довольным. это может быть доходность ( "внутри" ). или что угодно.
А затем на дочерней странице, где вы хотите импортировать html со страницы макета, просто скажите раздел ('name of the section')
.
например, если вы отметили свой заголовок на своей странице макета как yield ('my_head_band')
< - или что-нибудь еще, что хотите, тогда на вашей дочерней странице вы просто скажете @section('my_head_band')
.
Это будет импортировать заголовок с страницы макета на вашу дочернюю страницу. наоборот, с вашим разделом тела, который в этом случае был назван как контент.
Надеюсь, что это поможет.
Ответ 4
Кратчайший ответ:
Используйте @yield
в master, если вы хотите полностью перезаписать дочерние данные в master layout.
Используйте @section
в master, если вы хотите использовать основные и дочерние данные вместе для child с @parent
(или перезаписать дочерние данные в master layout, как @yield
)