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>
相關文章
相關標籤/搜索