我正在学习Laravel(从版本5.3开始),这两个看起来非常相似,我知道的唯一区别是@include注入父变量并且还可以发送其他变量。
答案 0 :(得分:19)
@yield主要用于定义布局中的一个部分。当使用@extends扩展该布局时,您可以在视图中使用@section指令定义该部分中的内容。
布局通常包含HTML,头部,正文,页眉和页脚。您可以在布局中定义一个区域(@yield),扩展模板的页面会将其内容放入其中。
在主模板中定义区域。例如:
<body>
@yield('content')
</body>
让我们说你的主页扩展了那个布局
@extends('layouts.app')
@section('content')
// home page content here
@endsection
您在“内容”部分的主页视图的内容部分中定义的任何HTML都会被注入其在该位置扩展的布局中。
@include用于可重用的HTML,就像标准的PHP包含一样。它没有像@yield和@section这样的父/子关系。
我强烈建议您阅读Laravel网站上的Blade Templates文档,以获得更全面的概述
答案 1 :(得分:16)
@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 >
然后在@include指令所在的位置导入'file_name'(也是一个刀片文件)的内容。
@yield 从子文件中的“section”导入代码(“查看”刀片文件。),即:
布局文件:
< some html or other script >
@yield('needed_section_name')
< more html or other script >
“视图”刀片文件中需要以下部分,该文件设置为“扩展”该布局文件。
“查看”刀片文件:
@extends('layout.file_name')
... code as neeeded
@section('needed_section_name')
< some cool code here >
@stop
...
more code as needed
现在,布局文件将导入与所使用的命名相匹配的代码部分。
有关此主题的更多信息here ....
答案 2 :(得分:3)
@yield
和@include
之间的区别在于您如何使用它们。
如果您有诸如导航栏之类的静态内容,页面的这一部分将始终位于布局中的同一位置。当您在布局文件中使用@include
时,导航栏将在每个布局中放置一次。但是,如果您使用@yield
,则将强制在@section
版面的每个页面上制作导航栏@extends
。
@yield
是一个更好的选择,但是您仍然希望在各处使用相同的布局。如果您使用@include
,则由于内容的不同,必须为每个页面创建新的布局。
答案 3 :(得分:1)
@yield 当您的内容将被更改时应使用 @include 应该用于不会改变的内容。例如页眉、页脚
答案 4 :(得分:0)
例如,您已经拥有布局结构,其中您 @include(“某些脚本或样式”)。它不允许您更改其指令,而 @yield 可以更改其内容。表示您创建了一个 section 以将{em> yield 生成到function checkEvt(){
var evTypep=window.performance.getEntriesByType("navigation")[0].type;
if (evTypep=='reload'){
window.location.replace("http://www.stackoverflow.com");
}
}
checkEvt();
中。如果每个页面中都有特定的脚本或样式,也可以使用yield。
layout.blade.php
答案 5 :(得分:0)
今天我也试图找出这种差异,以及在何处使用每种差异,以及为什么我要使用一种而不是另一种。请注意,这个答案很冗长,而且可能解释得太过分了。
来自 Laracasts 论坛的 Snapey 让我开始正确地思考它们: https://laracasts.com/discuss/channels/laravel/whats-the-difference-between-atinclude-and-atyield
首先,@include 将包含整个文件,就像 PHP 的包含函数一样。如果您只是将整个内容文件转储到页面的 <body>
中,那就太好了,例如以下内容将包含“content.blade.php”中的所有内容:
<!-- layout.blade.php -->
<body>
@include('content')
</body>
<!-- content.blade.php -->
<div>
<div>
<p>Hey this is my content.</p>
</div>
<div>
<span>and stuff</span>
</div>
</div>
但是@yield 与@extends 以及@section 和@endsection 指令结合使用,将允许您将内容分成不同的部分,但将所有内容保存在一个文件中。然后你可以@yield 将它分成单独的块放入布局中。想到的视觉效果是将一副牌的一半洗到另一半,以经典的“浅浅”洗牌:
<!-- content.blade.php -->
@extends('layout')
@section('top_content')
<h1>Hey I'm the title</h1>
@endsection
@section('middle_content')
<p>Hey how's it going</p>
@endsection
@section('other_content')
<p>It's over now.</p>
@endsection
<!-- layout.blade.php -->
<body>
<div>
@yield('top_content')
</div>
<p>Some static content</p>
<div>
@yield('middle_content')
</div>
<p>Some more static content</p>
<div>
@yield('other_content')
</div>
<div>Static footer content of some kind</div>
</body>
其次,也许更重要的是,控制流程有点颠倒,使一切更加连贯。在第一个示例中,使用 @include,您将使用视图助手以自上而下的方式调用布局文件。例如,这可能是您的代码:
Route::get('/', function () {
return view('layout');
});
但是对于@yield 和@extends,(如第二个示例中)您调用内容文件本身,内容文件将首先查看@extends 指令以将自己与布局叠加起来文件,就像穿上外套一样。所以从某种意义上说,它是反向发生的,就像自下而上。然后@yield 指令按照指定注入内容。内容文件是您在路由器/控制器中与之交谈的人:
Route::get('/', function () {
return view('content');
});
您调用内容视图,它查看@extends 指令以选择布局,然后布局文件中的@yield 指令将匹配的@section 部分注入到布局中。
所以这种方式更有用,因为在实践中,当您引用不同的视图时,您将引用不同的内容。
如果您只使用@include 语句来构建视图,那么您必须将不同的内容段传递给您每次调用的布局文件,可能如下所示:
Route::get('/welcome', function () {
return view('layout', ['content' => 'welcome']);
});
Route::get('/profile', function () {
return view('layout', ['content' => 'profile']);
});
<!-- layout.blade.php -->
<body>
@include($content)
</body>
这对我来说似乎是一团糟。
话虽如此,@include 似乎是在布局文件(@extends 指令调用的那个)中包含一小段代码的好方法,例如导航栏、页脚或您只想添加的内容出于组织目的,从您的布局文件中分离出来。