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)