首頁 > php教程 > PHP开发 > 主體

Laravel模板引擎Blade中section的一些標籤的差異介紹

高洛峰
發布: 2016-12-27 10:59:06
原創
1184 人瀏覽過

Laravel 框架中的 Blade 模板引擎,很好用,但是在官方文件中有關 Blade 的介紹並不詳細,有些東西沒有寫出來,而有些則是沒有說清楚。例如,使用上可能會遇到這樣的問題:

1.@yield 和 @section 都可以預先定義可替代的區塊,這兩者有什麼差別呢?
2.@section 可以用 @show, @stop, @overwrite 以及 @append 來結束,這三者又有什麼差別呢?

本文試對這些問題做一個比較淺顯但是直觀的介紹。

@yield 與@section

首先,@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 關鍵字,父模板中的內容會被保留,然後再擴展後添加的內容進去,輸出的內容會是 “預設的內容 擴展的內容”。

官方網站上的文檔中並沒有涉及@parent關鍵字,說的是默認行為是“擴展”,要覆蓋需要用@override 來結束,這是錯的,[github 上的最新文檔][docs]已經做了修正。 @section 加上 @stop,預設是替換(注入),必須用 @parent 關鍵字才能擴充。而@override 關鍵字其實有另一個的應用場景。

@show 與 @stop

接下來再說說與 @section 對應的結束關鍵字,@show, @stop 有什麼區別呢? (網路上的部分文章,以及一些編輯器插件還會提示 @endsection, 這個在 4.0 版本中已經被移除,雖然向下兼容,但是不建議使用)。

@show 指的是執行到此處時將該section 中的內容輸出到頁面,而@stop 則只是進行內容解析,並且不再處理當前模板中後續對該section的處理,除非用@override覆蓋(詳見下一部分)。通常來說,在第一次定義某個 section 的時候,應該用 @show,而在取代它或擴充它的時候,不應該用 @show,應該用 @stop。以下用例子說明:

{{-- layout.master --}}
<div id="zoneA">
  @section(&#39;zoneA&#39;)
      AAA
      @show
     
   
</div>
 
 
 
 
<div id="zoneB">
  @section(&#39;zoneB&#39;)
      BBB
      @stop
     
   
</div>
 
 
 
 
<div id="zoneC">
  @section(&#39;zoneC&#39;)
      CCC
      @show
     
   
</div>
登入後複製
{{-- page.view --}}
@extends(&#39;layout.master&#39;)
 
@section(&#39;zoneA&#39;)
aaa
@stop
 
@section(&#39;zoneB&#39;)
bbb
@stop
 
@section(&#39;zoneC&#39;)
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 出現了兩次。

@append 和 @override

剛才說到了,@override 並不是在子模板中指明內容替換父模板的預設內容,而是另有用途,那麼是如何使用呢?這又牽涉到一個 section 在模板中可以多次使用的問題。也也就是我們所定義的每一個 section ,在後續的子模板其實是可以多次出現的。例如:

{{-- master --}}
<div>
  @yield(&#39;content&#39;)
     
   
</div>
登入後複製

{{-- subview --}}
@extends('master')
 
@section('content')
加一行內容
@append
 
@section('content加一行內容
@append
 
@section('content'content')一行內容
@append
 
@section('content')
加夠了,到此為止。

@stop

在上例中,我在父級模板中只定義了一個名為 "content" 的 section,而在子模板中三次指定了這個 section 的內容。 這個例子最終的輸出是:

<div>
加一行内容
再加一行内容
加够了,到此为止吧。
</div>
登入後複製

三次指定的內容都顯示出來了,關鍵就在於 @append 這個關鍵字,它表明“此處的內容添加到”,因此內容會不斷擴展。而最後用了 @stop,表示這個 section 的處理到此為止。如果後面繼續用 @append 或 @stop 來指定這個 section 的內容,都不會生效。除非用 @override 來處理。 @override 的意思是「覆蓋之前的所有定義,以這次的為準」。例如:

{{-- master --}}
<div>
  @yield(&#39;content&#39;)
    @yield(&#39;message&#39;)
     
   
</div>
登入後複製
{{-- master --}}
<div>
  @section(&#39;content&#39;)
    加一行内容
    @append
    @section(&#39;content&#39;)
    再加一行内容
    @append
    @section(&#39;content&#39;)
    加够了,结束吧
    @stop
    @section(&#39;content&#39;)
    都不要了,我说的。
    @override
     
   
</div>
登入後複製

這個例子和剛才的類似,只不過最後加了一組定義。最後的輸出會是:

<div>
  都不要了,我说的。
</div>
登入後複製
🎜所以,在正式的專案中,有時候需要對資料進行遍歷輸出的,可以使用 @append,而如果遍歷到了某個資料發現前面的都錯了呢?用 @override 就可以全部推翻。 🎜

更多Laravel模板引擎Blade中section的一些標籤的區別介紹相關文章請關注PHP中文網!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板