Какая разница между Laravel @yield и @include?

Я изучаю Laravel (начиная с версии 5.3), и эти два очень похожи, единственная разница, которую я знаю, это то, что @include вводит родительские переменные и может также отправлять другие переменные.

  • Какая разница между @yield и @include?
  • Когда следует использовать @yield?
  • Когда следует использовать @include?

Ответ 1

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

Обычно макет содержит ваш HTML, head, body, верхний и нижний колонтитулы. Вы определяете область (@yield) в макете, которую ваши страницы, расширяющие шаблон, помещают их содержимое.

В шаблоне мастера вы определяете область. Например:

<body>
     @yield('content')
</body>

Допустим, ваша домашняя страница расширяет этот макет

@extends('layouts.app')

@section('content')
     // home page content here
@endsection

Любой HTML, который вы определяете в разделе контента на домашней странице в разделе "контент", будет введен в макет, который он расширил в этом месте.

@include используется для повторного использования HTML, как и стандартный PHP. У него нет таких отношений между родителями и детьми, как @yield и @section.

Я настоятельно рекомендую прочитать документацию на Blade Templates на сайте Laravel для более полного обзора

https://laravel.com/docs/5.0/templates

Ответ 2

@include и @yield - два совершенно разных типа операций для импорта кода в текущий файл.

@include - импортировать содержимое отдельного файла в текущий файл в том месте, где оно размещено. то есть:

Файл макета:

< some html or other script >

@include('include.file_name') // "include." indicates the subdirectory that the file is in

< more html or other script >

Включить файл (файл клика с блоком кода):

< some cool code here >

Содержимое "file_name" (также файл клика) затем импортируется, где находится директива @include.

@yield импортирует код из "раздела" в дочернем файле (файл "view"), т.е.

Файл макета:

< some html or other script >

@yield('needed_section_name')

< more html or other script >

В файле "view" blade файла, который настроен на "расширение" этого файла макета, необходим следующий раздел.

"Просмотр" файла клинка:

@extends('layout.file_name')
... code as neeeded

@section('needed_section_name')
< some cool code here >
@stop

...
more code as needed

Теперь файл макета будет импортироваться в раздел кода, который соответствует используемому имени.

Подробнее об этом здесь....

Ответ 3

Разница между @yield и @include заключается в том, как вы их используете.

Если у вас есть статический вид контента, например navbar, эта часть страницы всегда будет в одном месте в макете. Когда вы используете @include в файле макета, navbar будет помещаться один раз для макета. Но если вы используете @yield вы будете принуждены к тому, чтобы сделать @section navbar на каждой странице, @extends макет.

@yield другой стороны, @yield - лучший выбор, когда контент меняется на всех страницах, но вы все равно хотите использовать один и тот же макет везде. Если вы используете @include вам нужно будет создать новый макет для каждой страницы из-за разницы в содержании.