В чем разница между секцией и стеком в клинке?

Мы можем использовать section, чтобы определить некоторый HTML, а затем yield, что где-то еще.

Так почему у нас есть стопки? https://laravel.com/docs/5.2/blade#stacks

Он делает то же самое с разными ключевыми словами, но имеет меньше вариантов (нет наследования).

@push('scripts')
    <script src="/example.js"></script>
@endpush

<head>
    <!-- Head Contents -->

    @stack('scripts')
</head>

Может быть сделано с разделом:

@section('scripts')
    <script src="/example.js"></script>
@endsection

<head>
    <!-- Head Contents -->

    @yield('scripts')
</head>

Ответ 1

Возможно, я ошибаюсь, но разница не только семантически, но и в поведении. С помощью @push вы добавляете столько раз, сколько необходимо для стека, тогда как (по умолчанию) вы можете заполнить @section только один раз в своих представлениях. В некоторых ситуациях это пригодится, когда вам нужно добавлять контент из разных мест в файлы шаблонов или в циклы:

index.blade.php:

@extends('master')

...  

@for ($i = 0; $i < 3; $i++)

  @push('test-push')
    <script type="text/javascript">
    // Push {{ $i }}
    </script>
  @endpush

  @section('test-section')
    <script type="text/javascript">
    // Section {{ $i }}
    </script>
  @endsection

@endfor

master.blade.php

    @stack('test-push')
    @yield('test-section')
</body>

результат:

    <script type="text/javascript">
    // Push 0
    </script>
        <script type="text/javascript">
    // Push 1
    </script>
        <script type="text/javascript">
    // Push 2
    </script>
    <script type="text/javascript">
    // Section 0
    </script>
    </body>

Ответ 2

Стек подходит для сценариев, причем стек можно добавить столько, сколько вам нужно.

@push('scripts')
    <script src="/example.js"></script>
 @endpush

Добавить...

<head>
<!-- Head Contents -->

@stack('scripts')
</head>

Как вы можете видеть, стек скриптов будет добавлен в тег script example.js. Таким образом, вы можете создавать специальные сценарии для каждого вида.