Laravel - @ yield和@section之间的区别?

时间:2015-03-16 06:01:17

标签: laravel blade

Laravel docs,您可以使用两种方法在布局中包含“部分”:

<html>
    <body>
        @section('sidebar')
            This is the master sidebar.
        @show

        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

由于@yield也可以使用@yield('section', 'Default Content')传递一些默认内容,@yield只是@section使用@parent的简写吗?< / p>

@section
    <!-- Nothing here -->
@show

还有其他什么差异?

5 个答案:

答案 0 :(得分:22)

这一行清除了混淆:&#34;请注意,扩展Blade布局的视图只是覆盖布局中的部分。布局内容可以使用@parent指令在子视图中包含在&#34;部分中。

因此,如果您已在主布局中定义@section,则除非您在子布局@parent内指定@section,否则将覆盖它。

但是对于@yield,它总是从子布局中获取部分。这意味着它始终会覆盖@yield部分,即使其默认定义为@yield('section', 'Default Content')

我希望能够清除你的困惑。如果您有更多问题,请与我们联系。感谢

答案 1 :(得分:17)

简短回答:始终使用@yield,除非您想要做一些更复杂的事情,然后提供默认的string

长答案: 每当您扩展刀片模板时,都会选择覆盖 @yield @section .. @show 。使用 @yield 可以完成的所有操作也可以使用 @section .. @show 完成,但不是相反。以下是他们的所作所为:

<强> @yield( '主')

  • 可以替换为 @section('main').. @ endsection
  • 可以提供默认字符串但不提供HTML!当没有提供 @section('main').. @ endsection 时,默认字符串将显示在子刀片模板中。

@section('main').. @ show

  • 可以替换为 @section('main').. @ endsection
  • 可以提供默认的HTML代码。当没有提供 @section('main')时,默认的HTML代码将显示在子刀片模板中。
  • 可以替换为 @section('main')@ parent .. @endsection ,另外还会显示默认的HTML代码。

以下是一些示例:test.blade.php

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Test</title>
  </head>
  <body>
    <h1>This is a test</h1>

    @yield('mainA')
    @yield('mainB', 'This is the alternative 1')
    @yield('mainC', '<p>This is the alternative 2</p>')
    @yield('mainD', 'This is the alternative 3')

    @section('testA')
    @show

    @section('testB')
      This is the alternative 4
    @show

    @section('testC')
      <p>This is the alternative 5</p>
    @show

    @section('testD')
      <p>This is the alternative 6</p>
    @show


  </body>
</html>

这是另一个名为testA.blade.php的文件,它扩展了另一个刀片文件:

@extends('test')

@section('mainD')
  <div>
    <p>First replacement!</p>
    <hr>
  </div>
@endsection

@section('testC')
  <div>
    <p>Second replacement!</p>
    <hr>
  </div>
@endsection

@section('testD')
  @parent
  <div>
    <p>Additional content</p>
    <hr>
  </div>
@endsection

这就是结果:

enter image description here

答案 2 :(得分:3)

基本上yield('content')是一个标记。例如,如果您放置yield('content'),则在标记中,您说这部分具有内容的名称,顺便说一句,您可以在括号内命名您想要的任何内容。它不必满足。它可以是收益(&#39;内部&#39;)。或任何你想要的东西。

然后在您要从布局页面导入html的子页面中,您只需说出('name of the section')部分。
例如,如果您已在布局页面中将标题标记为yield ('my_head_band')&lt; - 或您想要的任何其他内容,那么请在您的子页面中说出@section('my_head_band')

这会将布局页面中的标题导入您的子页面。反之亦然,你的身体部分,在这种情况下被命名为内容。

希望这有帮助。

答案 3 :(得分:0)

最短答案:

如果要完全覆盖主版式上的子数据,请在主版中使用@yield

如果要与@section一起在子级上使用主数据和子级数据,请在母版中使用@parent(或在@yield等主版式上覆盖子数据)

答案 4 :(得分:0)

只需添加一些小内容,@yield基本上定义了一个由overwriting数据注入的部分,并且如果我们的视图@extends是父视图,它也可以工作。

现在,当我们overwrite时,我们用新的实现完全替换了一个实现,就像公司可以在发现某个问题出了问题时决定更改/覆盖其整个技术一样。

不应与override

混淆