Blade模板是是laravel提供的模板引擎,它簡單強(qiáng)大,Blade允許在視圖中使用原生PHP代碼,Laravel使用的是編譯后的緩存文件,而不是視圖本身,所以Blade對于應(yīng)用程序來說是零開銷。
Blade模板是:
Blade 是 Laravel 提供的模板引擎,它簡單強(qiáng)大。不像其他的 PHP 模板引擎,Blade 允許在視圖中使用原生 PHP 代碼。
實際上,所有的 Blade 視圖最終都會被編譯成原生 PHP 代碼,緩存在 storage/framework/views 文件夾中。
Laravel 使用的是這些編譯后的緩存文件,而不是視圖本身,所以,Blade 對于應(yīng)用程序來說是零開銷的。當(dāng)你修改了視圖文件,那么它會重新編譯并緩存,以便使用。Blade 視圖以 blade.php 為后綴名,一般存放于 resources/views 文件夾中。
模板繼承:
1、定義布局文件
Blade 模板引擎的主要兩個優(yōu)點是 “模板繼承” 和 “區(qū)塊”。舉一個簡單的例子,一個項目里,幾乎所有的頁面都是一樣的布局,這時候就可以把這個布局提煉出來,作為母版頁,繼承了這個母版頁的的頁面都有一樣的布局效果,成為母版頁的子頁。母版頁還叫布局文件,布局文件就是一個 Blade 視圖:
<!-- Stored in resources/views/layouts/app.blade.php --> ??????? ?????????????<title>App?Name?-?@yield('title')</title> ??????? ??????? ?????????@section('sidebar') ???????????????This?is?the?master?sidebar. ?????????@show ?????????<div> ??????????????@yield('content') ?????????</div> ???????
布局文件里除了基礎(chǔ)的 HTNL 標(biāo)簽,還使用了兩個指令:@section 和 @yield 。@section定義區(qū)塊,@yield 定義區(qū)塊里的內(nèi)容。
下面。來定義布局文件的子頁。
2、繼承布局文件
子頁中,使用 Blade 的 @extends 指令指定 “繼承” 的布局文件,使用 @section 指令為在布局文件中使用 @section 和 @yield 指令的地方注入內(nèi)容:
<!-- 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 注入內(nèi)容;在布局文件中使用 @section 指令定義的一個好處是:在子頁中使用 @section 注入時,可以使用 @parent 指令附加(而非重寫)在布局文件中的內(nèi)容,而在布局文件中使用 @yield 指令定義的地方是做不到的。@parent 指令會在視圖渲染的時替換成布局文件里的內(nèi)容。
注意,與在文件布局里定義的 sidebar 不同的是,子頁里使用 @endsection 結(jié)束,而非 @show 。因為 @endsection 僅用來定義區(qū)塊,而 @show 是用來定義、立馬產(chǎn)出區(qū)塊的。
從路由中直接返回視圖文件,要用到全局輔助函數(shù) helper :
Route::get('blade',?function(){ ????????return?view('child'); })
3、組件&插槽
組件和插槽提供了類似布局和區(qū)塊的優(yōu)點。而組件和插槽的心智模型更符合直覺。設(shè)想一下,在我們的項目中有一個可重復(fù)的 “彈框” 組件:
<!-- Stored resource/views/alter.blade.php --> <div> ???????{{?$slot?}} </div>
{{ $slot }} 表示插入組建的內(nèi)容。構(gòu)建此組件,是使用 Blade 的@component指令:
@component('alter') ????????<strong>Whoops!</strong>?Something?went?wrong! @endcomponent
在這個場景里,{{ $slot }} 變量的內(nèi)容是:
<strong>Whoops!?</strong>?Something?went?wrong!
有時一個組件需要多個插槽。這時,只需要稍改組件代碼,定義一個 “標(biāo)題” 插槽,這個插槽稱命名插槽。命名插槽是通過簡單的 “打印” 匹配其名稱的變量來顯示內(nèi)容的:
<!-- Stored resources/views/alter.blade.php--> <div> ?????????<div>{{?$title?}}</div> ????????????{{?$slot?}} </div>
為名名插槽注入內(nèi)容,使用 @slot 指令。所有不在 @slot 指令里的內(nèi)容都會傳遞給組件里的 $slot 變量。
@compontent?('alter') ?????????@slot('title') ????????????Forbidden ?????????@endslot ?????You?are?not?allowed?to?access?this?resource! @edcompontent~
4、為組建傳遞額外數(shù)據(jù):
有時需要為組建件遞額外數(shù)據(jù)。為此,可以為 @conponent 指令傳遞第二個數(shù)組參數(shù)。指定要傳遞的額外。據(jù)所有過去的額外數(shù)據(jù)作為變量,在組件模板里都可以取的:
@component ?????<compontent>?'bar'); ?????????..... @endCompontent</compontent>
5、顯示數(shù)據(jù)
向 Blade 視圖傳遞數(shù)據(jù),是通過將變量包裹在 [ ] 里實現(xiàn)的:
Route::get('greeting',?function(){ ?????????return?view('welcome',?[?'name'?=>?''Samantha']); })
下面就可以使用 name 變量顯示內(nèi)容了:
Hello!?{{?$name?}}
{{ }} 是 Blade 視圖的打印語句,當(dāng)然,打印語句里不限制只能打印變量內(nèi)容,也可以使用 PHP 函數(shù)。實際上,打印語句這里可以使用任何 PHP 代碼:
The?current?UNIX?timestamp?is?{{?time()?}}
6、顯示非轉(zhuǎn)移數(shù)據(jù)
默認(rèn),所有傳遞給 Blade {{ }} 語句的內(nèi)容都會使用 htmlspecialchar 函數(shù)處理、將內(nèi)容轉(zhuǎn)義,避免 XSS 攻擊。如果無需轉(zhuǎn)義輸出的內(nèi)容,可以使用下面語法:
Hello!?{{!!?$name?!!}}.
不過千萬要小心,應(yīng)該優(yōu)先選擇使用轉(zhuǎn)義的 {{ }} 語法避免 XXS 攻擊。因為,有時你很難避免用戶有意的、無意的數(shù)據(jù)輸入。
相關(guān)學(xué)習(xí)推薦:Laravel