Laravel 模板引擎Blade中标签详细介绍

  这篇文章主要介绍了Laravel模板引擎Blade中section的一些标签的区别介绍,须要的朋友能够来看看。git

  Laravel 框架中的Blade模板引擎很好用,可是官方文档介绍的并不详细,我接下来将详细的介绍下:github

@yield与@sectionapp

  首先,@yield是不可拓展的,若是你要定义的部分没有默认内容让子模版扩展,那么用@yield($name,$default)的形式会比较方便,若是你在子模版中并无指定这个区块的内容,它就会显示默认内容,若是定义了,就会显示你定义的内容。框架

与之比较,@section则既能够被替代,又能够被扩展,这是最大的区别。好比:编辑器

{{-- layout.master --}}
@yield('title','默认标题')
 
@section('content')
默认的内容
@show
复制代码 代码以下:


{{-- home.index --}}
@extends('layout.master')
 
@section('title')
  @parent
  新的标题
@stop
 
@section('content')
  @parent
  扩展的内容
@stop

  上面的例子中,模板用 @yield 和 @section 分别定义了一个区块,而后在子模板中去定义内容,因为 @yield 不能被扩展,因此即便加上了 @parent 也不起做用,输出的内容只有“新的标题”,替换了“默认的标题”。所以最终生成的页面只能是“默认的标题”或者“新的标题”,不能并存。而 @section 定义的部分,因为使用了 @parent 关键字,父模板中的内容会被保留,而后再扩展后添加的内容进去,输出的内容会是 “默认的内容 扩展的内容”。ide

官方网站上的文档中并无涉及 @parent关键字,说的是默认行为是“扩展”,要覆盖须要用 @override 来结束,这是错的,[github 上的最新文档][docs] 已经作了修正。@section 加上 @stop,默认是替换(注入),必须用 @parent 关键字才能扩展。而@override 关键字实际上有另外的应用场景。网站

  @show 与 @stopspa

  接下来再说说与 @section 对应的结束关键字,@show, @stop 有什么区别呢?(网上的部分文章,以及一些编辑器插件还会提示 @endsection, 这个在 4.0 版本中已经被移除,虽然向下兼容,可是不建议使用)。插件

@show 指的是执行到此处时将该 section 中的内容输出到页面,而 @stop 则只是进行内容解析,而且再也不处理当前模板中后续对该section的处理,除非用 @override覆盖(详见下一部分)。一般来讲,在首次定义某个 section 的时候,应该用 @show,而在替换它或者扩展它的时候,不该该用 @show,应该用 @stop。下面用例子说明:code

{{-- layout.master --}}
<div>
  @section('zoneA')
      AAA
      @show
     
   
</div>
 
 
 
 
<div>
  @section('zoneB')
      BBB
      @stop
     
   
</div>
 
 
 
 
<div>
  @section('zoneC')
      CCC
      @show
     
   
</div>
{{-- page.view --}}
@extends('layout.master')
 
@section('zoneA')
aaa
@stop
 
@section('zoneB')
bbb
@stop
 
@section('zoneC')
ccc
@show

  在 layout.master 中,用 @stop 来结束 "zoneB",因为整个模板体系中,没有以 @show 结束的 "zoneB" 的定义,所以这个区块不会被显示。而在 page.view 中,用 @show 定义了 'zoneC',这会在执行到这里时当即显示内容,并按照模板继承机制继续覆盖内容,所以最终显示的内容会是:

ccc // 来自 page.view
<div>
  aaa
     
   
</div>
 
 
 
 
<div>
   
</div>
 
 
 
 
<div>
  ccc
     
   
</div>

  从结果能够看到,zoneB 的内容丢失,由于没有用 @show 告诉引擎输出这部分的内容,而 zoneC 的内容会显示两次,而且还破坏了 layout.master 的页面结构,由于 @show 出现了两次。

  @append 和 @override

  刚才说到了,@override 并非在子模板中指明内容替换父模板的默认内容,而是另有用途,那么是如何使用呢?这又涉及到一个 section 在模板中能够屡次使用的问题。也即咱们所定义的每个 section ,在随后的子模板中实际上是能够屡次出现的。好比:

{{-- master --}}
<div>
  @yield('content')
     
   
</div>
复制代码 代码以下:


{{-- subview --}}
@extends('master')
 
@section('content')
加一行内容
@append
 
@section('content')
再加一行内容
@append
 
@section('content')
加够了,到此为止吧。
@stop

  在上例中,我在父级模板中只定义了一个名为 "content" 的 section,而在子模板中三次指定了这个 section 的内容。 这个例子最终的输出是:

<div>
加一行内容
再加一行内容
加够了,到此为止吧。
</div>
相关文章
相关标签/搜索