前言


一、大綱

From: https://www.imooc.com/video/12509

Blade檢視頁面 --> 編譯 --> 原生PHP --> 並快取起來。

既然是個模板:通用的“頭部”和“尾部”。

二、新增模板檔案 (.blade.php)

Blade 模板


一、模板繼承

  • 定義佈局 - [1]

section, yield, extends, parent四個關鍵字。

[resources/views/layouts.blade.php]

  • 初步理解關鍵字

@section

定義檢視片段。

@yield

類似佔位符,顯示某個制定section所代表的內容。用子模板去實現它。

不可擴充套件。只是聲明瞭一個檢視片段。

  • 載入佈局

Route --> Controller --> template for view.

[1]  路由

Route::any('section1', ['uses' => 'StudentController@section1']);

[2]  控制器

public function section1()
{
  return view('student.section1');  // 渲染模板
}

student/section1可以;student.section1也可以,但推薦後者。

[3]  檢視 載入佈局

新建 resources/views/student/section1.blade.php

Jeff: 這裡,檢視繼承了layouts的內容。

@extends('layouts')

這樣,便載入了預設 resources/views 下的 layouts.blade.php。

  • 繼承佈局 - [2]

先通過 @extends 繼承父模板主體。

其實就是“重寫佈局”區域性內容。

 

  • 若干疑難點

[1] yield與section的區別?

** 初步理解:

- @yield() 可以理解為一個佔位符。
- @section('head') 表示一個儲存區域,這個區域內定義的內容,在子模板中可以通過 @parent 進行呼叫。

** 不能被擴充套件如何理解:

@yield 不能被擴充套件,所以即使加上了 @parent 也不起作用,輸出的內容只有“新的標題”,替換了“預設的標題”。

@section 定義的部分,由於使用了 @parent 關鍵字,父模板中的內容會被保留,然後再擴充套件後新增的內容進去。

[2] @section ... @stop ... @show ... @endsection

Ref: Laravel5.4初試-@yield @section @show @stop @append標籤區別

Ref: Blade 模板中有關 section 的那些事【這才是原文】

** @endsection

這個在 4.0 版本中已經被移除,雖然向下相容,但是不建議使用

** @show 與 @stop

@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

最終顯示結果:

從結果可以看到,zoneB 的內容丟失,因為沒有用 @show 告訴引擎輸出這部分的內容,而 zoneC 的內容會顯示兩次,並且還破壞了 layout.master 的頁面結構,因為 @show 出現了兩次。

ccc // 來自 page.view
<div class="zoneA">
aaa
</div> <div class="zoneB"> </div> <div class="zoneC">
ccc
</div>

一個理解: 

@section('content')
<h1>Test</h1>
@show
is equivalent to @section('content')
<h1>Test</h1>
@stop @yield('content')

二、模板呼叫PHP

  • view 使用 "變數 from controller"

Controller中定義了一個變數:

public function section1()
{
  $name = 'sean‘ ;
  return view('student.section1', [
    'name' => $name
  ]);
}

view的模板檔案 [resources/views/student/section1.blade.php]:

@section('content')
content <p>{{ $name }} </p>
@stop

效果如下:

  • 直接呼叫php程式碼

[1] 檢視中使用程式碼如下:

其中最後一樣的or寫法是上一行三元表示式的替代寫法在blade中。

[2] 控制器中定義變數。

public function section1()
{
  $name = 'sean‘;
  $arr = ['sean', 'imooc'];
  return view('student.section1', [
    'name' => $name,
    'arr' => $arr,
  ]);
}
  • 轉移字元@
<p>@{{ $name }}</p>
  • 模板中註釋

模板的註釋在解析後的html中是看不到的。

<!-- 一二三 -->    # php註釋

{{-- 四五六 --}}    # 模板註釋,用於比較隱私的註釋方法

三、include的使用

  • 類似子函式

引入子檢視,不是都需要,但用的地方也不少。

[1] Create sub-view as common1.blade.php

[2] sub-view,相當於 "將被呼叫" 的子函式。

<p> 我是include {{ $message }}</p>

[3] main-view 呼叫 sub-view 如下。

@include('student.common1', ['message' => '我是錯誤資訊'])

這裡,呼叫了student目錄下的common1.blade.php,並給引數message傳入了一個值:'我是錯誤資訊'
  • 實際使用示範

有點佔位符的意思。

四、流程控制

  • 條件判斷

[1] 檢視中可以使用if foreach等。

<br>
@if ($name == 'sean')
  I'm sean
@elseif ($name == 'imooc')
  I'm imooc
@else
  Who am I?
@endif <br>
@If (in_array($name, $arr))
  true
@else
  false
@endif

[2] unless 相當於 if 取反。

<br>
@unless($name == 'sean')
  I'm sean
@endunless
  • 迴圈遍歷

方法一

<br>
@for ($i = 0; $i < 10; $i++)
  <p>{{ $i }}</p>
#endfor 方法二 <br>
@foreach($students as $student)
  <p>{{ $student->name }}</p>
@endforeach
方法三
<br>
@forelse($students as $student)
  <p>{{ $student->name }}</p>
@empty
  <p>null</p>
@endforelse

五、模板中的URL

  • 點選連結後跳轉到這裡

[1]  路由

[app/Http/routes.php]

Route::any('url', ['as' => 'url', 'uses' => 'StudentController@urlTest']);

[2] 路由 --> 控制函式

[app/Http/Controllers/StudentController.php]

public function urlTest()
{
  return 'urlTest';  
}
  • 建立這個連結

在此,section1中新增一個連結:url()

看上去,貌似以下三個呼叫的分別是Route的那行程式碼的三個不同的部分。

方式一
<a href="{{ url('url') }}">url()</a> 方式二
<a href="{{ action('StudentController@urlTest') }}">action()</a>  # 寫得太長 方式三
<a href="{{ route('url') }}">route()</a>

新增後效果: