35

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

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

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

既然@yield也可以传入一些默认内容 using @yield('section', 'Default Content'),@yield只是 a @sectionthat doesn't use的简写@parent吗?

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

还有哪些不同之处?

4

5 回答 5

51

简短回答@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

这就是结果:

在此处输入图像描述

于 2017-10-01T10:04:59.270 回答
41

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

因此,如果您已经@section在主布局中定义了一个,它将被覆盖,除非您@parent在子布局的@section.

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

我希望这能消除你的困惑。如果您有更多问题,请告诉我。谢谢

于 2015-03-16T06:14:41.270 回答
6

最短的答案:

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

如果您想在子级上一起使用@section主数据和子数据,请在主数据中使用@parent(或覆盖主布局上的子数据,如@yield

于 2019-01-17T08:10:02.280 回答
5

基本上yield('content')是一个标记。例如,如果你在标签中放一个yield('content'),你说这部分有内容的名称,顺便说一下,你可以在括号内命名任何你想要的东西。它不必满足。它可以是 yield('inside')。或任何你想要的。

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

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

希望这可以帮助。

于 2017-08-09T11:09:31.687 回答
0

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

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

它不应该与override

于 2019-02-08T08:41:22.980 回答