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'), is @yield просто сокращение для @section, что не использует @parent?

@section
    <!-- Nothing here -->
@show

какие еще различия есть?

3 ответов


эта строка устраняет путаницу: "обратите внимание, что виды, которые расширяют макет лезвия, просто переопределяют разделы из макета. Содержимое макета может быть включено в дочернее представление с помощью


Короткий Ответ:: всегда используйте @yield Если вы не хотите сделать что-то более сложное, а затем предоставить по умолчанию string.


Ответ: Оба!--7-- > @yield и @раздел .. @ show используются для дополнительной перезаписи при каждом расширении шаблона лезвия. Все, что вы можете сделать с @yield и @раздел .. @ show но не наоборот. Вот что они do:

@yield ('main')

  • можно заменить на @раздел ('main').. @endsection
  • может быть предоставлена строка по умолчанию, но без HTML! Строки по умолчанию будет показано в подразделе лезвие-шаблон, когда нет @раздел ('main').. @endsection предусмотрено.

@раздел ('main').. @ show

  • можно заменить на @раздел ('main').. @endsection
  • может быть предоставлен HTML-код по умолчанию. HTML код по умолчанию будет отображаться в подразделе лезвие-шаблон, когда нет @раздел ('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


в принципе yield('content') - это маркер. Например, в теге, если вы поместите yield('content'), ваше высказывание в этом разделе имеет имя контента, и, кстати, вы можете назвать внутри скобки все, что хотите. она не должна быть довольной. это может быть выход('внутри'). или все, что захочешь.

а затем на дочерней странице, где вы хотите импортировать html с вашей страницы макета, вы просто говорите раздел('name of the section').
например, если вы пометили заголовок на странице макета как доходность('my_head_band') @section('my_head_band').

это импортирует заголовок со страницы макета на вашу дочернюю страницу. наоборот, с вашим разделом тела, который в этом случае был назван содержимым.

надеюсь, что это помогает.