laravel模板繼承中,經常使用的兩種方式即爲yield和section.laravel
@section('sidebar')
這是 master 的側邊欄。
@show
section命令正如其名字所暗示的同樣是用來定義一個視圖區塊的,其中每每還有內容,模板繼承的時候
yield指令是用來顯示指定區塊的內容的git
當子頁面繼承佈局以後,便可使用 @section 命令將內容注入於佈局的 @section 區塊中github
sidebar 區塊利用了 @parent 命令追加布局中的 sidebar 區塊中的內容,若是不使用則會覆蓋掉佈局中的這部份內容。 @parent 命令會在視圖被渲染時替換爲佈局中的內容。app
-------------------------框架
這篇文章主要介紹了Laravel模板引擎Blade中section的一些標籤的區別介紹,本文講解了@yield
與 @section
、@show
與 @stop
、@append
和 @override
的區別,須要的朋友能夠參考下編輯器
Laravel 框架中的 Blade 模板引擎,很好用,可是在官方文檔中有關 Blade 的介紹並不詳細,有些東西沒有寫出來,而有些則是沒有說清楚。好比,使用中可能會遇到這樣的問題:ide
1.@yield
和 @section
均可以預約義可替代的區塊,這二者有什麼區別呢?
2.@section
能夠用 @show
, @stop
, @overwrite
以及 @append
來結束,又有什麼區別呢?佈局
本文試對這些問題作一個比較淺顯可是直觀的介紹。網站
首先,@yield
是不可擴展的,若是你要定義的部分沒有默認內容讓子模板擴展的,那麼用 @yield($name, $default)
的形式會比較方便,若是你在子模板中並無指定這個區塊的內容,它就會顯示默認內容,若是定義了,就會顯示你定義的內容。非此即彼。spa
與之相比, @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
關鍵字,父模板中的內容會被保留,而後再擴展後添加的內容進去,輸出的內容會是 「默認的內容 擴展的內容」。
官方網站上的文檔中並無涉及 @parent
關鍵字,說的是默認行爲是「擴展」,要覆蓋須要用 @override
來結束,這是錯的,[github 上的最新文檔][docs] 已經作了修正。@section
加上 @stop
,默認是替換(注入),必須用 @parent
關鍵字才能擴展。而 @override
關鍵字實際上有另外的應用場景。
接下來再說說與 @section 對應的結束關鍵字,@show
, @stop
有什麼區別呢?(網上的部分文章,以及一些編輯器插件還會提示 @endsection
, 這個在 4.0 版本中已經被移除,雖然向下兼容,可是不建議使用)。
@show
指的是執行到此處時將該 section 中的內容輸出到頁面,而 @stop
則只是進行內容解析,而且再也不處理當前模板中後續對該section的處理,除非用 @override覆蓋(詳見下一部分)。一般來講,在首次定義某個 section 的時候,應該用 @show
,而在替換它或者擴展它的時候,不該該用 @show
,應該用 @stop
。下面用例子說明:
代碼以下:
{{-- layout.master --}} <div id="zoneA"> @section('zoneA') AAA @show </div> <div id="zoneB"> @section('zoneB') BBB @stop </div> <div id="zoneC"> @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 class="zoneA"> aaa </div> <div class="zoneB"> </div> <div class="zoneC"> ccc </div>
從結果能夠看到,zoneB 的內容丟失,由於沒有用 @show
告訴引擎輸出這部分的內容,而 zoneC 的內容會顯示兩次,而且還破壞了 layout.master 的頁面結構,由於 @show
出現了兩次。
剛纔說到了,@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>
三次指定的內容都顯示出來了,關鍵就在於 @append
這個關鍵字,它代表「此處的內容添加到」,所以內容會不斷擴展。而最後用了 @stop
,表示這個 section 的處理到此爲止。若是在後面繼續用 @append
或者 @stop
來指定這個 section
的內容,都不會生效。除非用 @override
來處理。 @override
的意思就是「覆蓋以前的全部定義,以此次的爲準」。好比:
代碼以下:
{{-- master --}} <div> @yield('content') @yield('message') </div>
代碼以下:
{{-- master --}} <div> @section('content') 加一行內容 @append @section('content') 再加一行內容 @append @section('content') 加夠了,結束吧 @stop @section('content') 都不要了,我說的。 @override </div>
這個例子和剛纔的相似,只不過最後加了一組定義。最終的輸出會是:
代碼以下:
<div> 都不要了,我說的。 </div>
因此,在正式的項目中,有時候須要對數據進行遍歷輸出的,可使用 @append
,而若是遍歷到了某個數據發現前面的都錯了呢?用 @override
就能夠所有推翻。