Laravel 框架中的 Blade 模板引擎,很好用,可是在官方文档中有关 Blade 的介绍并不详细,有些东西没有写出来,而有些则是没有说清楚。好比,使用中可能会遇到这样的问题:git
1.@yield 和 @section 均可以预约义可替代的区块,这二者有什么区别呢?
2.@section 能够用 @show, @stop, @overwrite 以及 @append 来结束,这三者又有什么区别呢?github
本文试对这些问题作一个比较浅显可是直观的介绍。app
@yield 与 @section框架
首先,@yield 是不可扩展的,若是你要定义的部分没有默认内容让子模板扩展的,那么用 @yield($name, $default) 的形式会比较方便,若是你在子模板中并无指定这个区块的内容,它就会显示默认内容,若是定义了,就会显示你定义的内容。非此即彼。ide
与之相比, @section 则既能够被替代,又能够被扩展,这是最大的区别。好比:网站
代码以下:
{{-- layout.master --}}
@yield('title','默认标题')spa
@section('content')
默认的内容
@show.net
代码以下:
{{-- home.index --}}
@extends('layout.master')模板引擎
@section('title')
@parent
新的标题
@stop文档
@section('content')
@parent
扩展的内容
@stop
上面的例子中,模板用 @yield 和 @section 分别定义了一个区块,而后在子模板中去定义内容,因为 @yield 不能被扩展,因此即便加上了 @parent 也不起做用,输出的内容只有“新的标题”,替换了“默认的标题”。所以最终生成的页面只能是“默认的标题”或者“新的标题”,不能并存。而 @section 定义的部分,因为使用了 @parent 关键字,父模板中的内容会被保留,而后再扩展后添加的内容进去,输出的内容会是 “默认的内容 扩展的内容”。
官方网站上的文档中并无涉及 @parent关键字,说的是默认行为是“扩展”,要覆盖须要用 @override 来结束,这是错的,[github 上的最新文档][docs] 已经作了修正。@section 加上 @stop,默认是替换(注入),必须用 @parent 关键字才能扩展。而@override 关键字实际上有另外的应用场景。