Blade模板是是Laravel提供的模板引擎,它簡單強大,Blade允許在視圖中使用原生PHP代碼,Laravel使用的是編譯後的緩存文件,而不是視圖本身,所以Blade對於應用程式來說是零開銷。
Blade模板是:
Blade 是 Laravel 提供的模板引擎,它簡單又強大。不像其他的 PHP 模板引擎,Blade 允許在視圖中使用原生 PHP 程式碼。
實際上,所有的 Blade 視圖最終都會被編譯成原生 PHP 程式碼,快取在 storage/framework/views
資料夾中。
Laravel 使用的是這些編譯後的快取文件,而不是視圖本身,所以,Blade 對於應用程式來說是零開銷的。當你修改了視圖文件,那麼它會重新編譯並緩存,以便使用。 Blade 視圖以 blade.php
為後綴名,一般存放於 resources/views
資料夾中。
範本繼承:
1、定義版面檔案
Blade 範本引擎的主要兩個優點是「範本繼承” 和“區塊”。舉一個簡單的例子,一個專案裡,幾乎所有的頁面都是一樣的佈局,這時候就可以把這個佈局提煉出來,作為母版頁,繼承了這個母版頁的的頁面都有一樣的佈局效果,成為母版頁的子頁。母版頁也叫佈局文件,佈局文件就是一個 Blade 視圖:
<!-- Stored in resources/views/layouts/app.blade.php --> <html> <head> <title>App Name - @yield('title')</title> </head> <body> @section('sidebar') This is the master sidebar. @show <div class="container"> @yield('content') </div> <body> </html>
佈局文件裡除了基礎的 HTNL 標籤,還使用了兩個指令:@section 和 @yield 。 @section定義區塊,@yield 定義區塊裡的內容。
下面。來定義佈局文件的子頁。
2、繼承佈局文件
子頁中,使用Blade 的@extends 指令指定「繼承」 的佈局文件,使用@section 指令為在佈局文件中使用@section 和@yield 指令的地方注入內容:
<!-- Stored in resources/views/child.blade.php --> @extends('layouts.app') @section('title','Page Title') @section('sidebar') <p> This is appended to the master sideebar</p> @endsection @section('content') <p>This ismy body content. </p> @endsection
可以看到,在佈局文件中使用@yield 指令的地方,在子頁中仍然使用@section 注入內容;在佈局文件中使用@section 指令定義的一個好處是:在子頁中使用@section 注入時,可以使用@parent 指令附加(而非重寫)在佈局文件中的內容,而在佈局文件中使用@yield 指令定義的地方是做不到的。 @parent 指令會在視圖渲染的時替換成佈局檔案裡的內容。
注意,與在檔案佈局中定義的 sidebar 不同的是,子頁裡使用 @endsection 結束,而不是 @show 。因為 @endsection 僅用來定義區塊,而 @show 是用來定義、立刻產出區塊的。
從路由直接傳回視圖文件,要用到全域輔助函數helper :
Route::get('blade', function(){ return view('child'); })
3、元件&插槽
元件和插槽提供了類似佈局和區塊的優點。而組件和插槽的心智模型更符合直覺。設想一下,在我們的專案中有一個可重複的 「彈框」 元件:
<!-- Stored resource/views/alter.blade.php --> <div class="alter alter-danger"> {{ $slot }} </div>
#{{ $slot }}
表示插入組成的內容。建立此元件,是使用Blade 的@component指令:
@component('alter') <strong>Whoops!</strong> Something went wrong! @endcomponent
在這個場景裡,{{ $slot }}
變數的內容是:
<strong>Whoops! </strong> Something went wrong!
有時一個組件需要多個插槽。這時,只需要稍改組件代碼,定義一個 “標題” 插槽,這個插槽稱命名插槽。命名插槽是透過簡單的 “列印” 匹配其名稱的變數來顯示內容的:
<!-- Stored resources/views/alter.blade.php--> <div class="alter alter-danger"> <div class="alter-title">{{ $title }}</div> {{ $slot }} </div>
為名名插槽注入內容,使用 @slot 指令。所有不在 @slot 指令裡的內容都會傳遞給元件裡的 $slot
變數。
@compontent ('alter') @slot('title') Forbidden @endslot You are not allowed to access this resource! @edcompontent~
4、為組成傳遞額外資料:
有時需要為組成件遞額外資料。為此,可以為 @conponent 指令傳遞第二個陣列參數。指定要傳遞的額外。根據所有過去的額外數據作為變量,在組件模板裡都可以取的:
@component <compontent('alter', ['foo' => 'bar'); ..... @endCompontent
5、顯示數據
向Blade 視圖傳遞數據,是透過將變數包裹在 [ ]
裡實現的:
Route::get('greeting', function(){ return view('welcome', [ 'name' => ''Samantha']); })
下面就可以使用name 變數顯示內容了:
Hello! {{ $name }}
{{ }}
是Blade 視圖的列印語句,當然,列印語句裡不限制只能列印變數內容,也可以使用PHP 函數。實際上,列印語句這裡可以使用任何PHP 程式碼:
The current UNIX timestamp is {{ time() }}
6、顯示非轉移資料
默認,所有傳遞給Blade {{ }}
語句的內容都會使用 htmlspecialchar
函數處理、將內容轉義,避免XSS 攻擊。如果不需要轉義輸出的內容,可以使用下面語法:
Hello! {{!! $name !!}}.
不過千萬要小心,應該優先選擇使用轉義的 {{ }}
語法避免 XXS 攻擊。因為,有時你很難避免使用者有意的、無意的資料輸入。
#相關學習推薦:Laravel
以上是Blade模板是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!