Laravel的@yield和@include有什么区别?

时间:2017-01-28 23:43:11

标签: laravel

我正在学习Laravel(从版本5.3开始),这两个看起来非常相似,我知道的唯一区别是@include注入父变量并且还可以发送其他变量。

  • @ yield和@include之间有什么区别?
  • 我什么时候应该使用@yield?
  • 我应该何时使用@include?

6 个答案:

答案 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文档,以获得更全面的概述

https://laravel.com/docs/5.0/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 指令调用的那个)中包含一小段代码的好方法,例如导航栏、页脚或您只想添加的内容出于组织目的,从您的布局文件中分离出来。