10

В чем отличие @yield от @show разве они не выполняют одно и то же действие?

VenZell
  • 19,872
quaresma89
  • 2,207

1 Answers1

13

Нет. У этих директив разное назначение.

@show, как и @endsection, используется для обозначения конца секции.

@show выводит содержимое секции на экран, сразу после объявления секции.
@endsection не делает ничего, кроме обозначения конца объявления секции.
@show и @endsection не могут существовать без предшествующей директивы @section.

@yield используется для вывода содержимого секции с определенным именем.
Эта директива вполне может существовать без предшествующей директивы @section, если та, например, была объявлена в одном из дочерних шаблонов.
Возможен вариант использования @yield, когда секция с указанным именем вообще не была объявлена, тогда надо передать в нее второй параметр, который будет служить значением по умолчанию.


Пример шаблона:

<html>
    <head>
        <title>Мое приложение @yield('non-existent-section', 'работает')</title>
    </head>
    <body>
        @section('displayed-content')
            Это содержимое секции, которое будет сразу выведено на экран.
        @show

        @section('declared-content')
            Это содержимое секции, для вывода которого надо использовать @yield
        @endsection

        <div class="content">
            <!-- выводим содержимое секции declared-content на экран -->
            @yield('declared-content')
        </div>
    </body>
</html>

Пример итогового файла:

<html>
    <head>
        <title>Мое приложение работает</title>
    </head>
    <body>
        Это содержимое секции, которое будет сразу выведено на экран.
        <div class="content">
            <!-- выводим содержимое секции declared-content на экран -->
            Это содержимое секции, для вывода которого надо использовать @yield
        </div>
    </body>
</html>

Подробнее в документации


В чем отличие @endsection от @stop

Как говорится в этом сообщении на SO:

Существует авторитетный ответ от Taylor Otwell

Директива @endsection стала @stop в L4, а @yieldSection стала @show.

Оригинальная цитата Taylor Otwell на github.

В Laravel 5 можно использовать любой из вариантов: @endsection или @stop.
Отличий в функционале нет, это одно и то же.

VenZell
  • 19,872