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 關鍵字實際上有另外的應用場景。