Blade中并不約束你使用PHP原生代碼。所有的Blade視圖都會被編譯成原生PHP代碼并緩存起來直到被修改,這意味著對應(yīng)用的性能而言Blade基本上是零開銷。Blade視圖文件使用.blade.php
文件擴展并存放在resources/views
目錄下。
使用Blade的兩個最大優(yōu)點是模板繼承和切片,開始之前讓我們先看一個例子。首先,我們檢測一個“主”頁面布局,由于大多數(shù)web應(yīng)用在不同頁面中使用同一個布局,可以很方便的將這個布局定義為一個單獨的Blade頁面:
<!-- 存放在 resources/views/layouts/master.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>
正如你所看到的,該文件包含典型的HTML標記,然而,注意@section
和@yield
指令,前者正如其名字所暗示的,定義了一個內(nèi)容的片段,而后者用于顯示給定片段的內(nèi)容。
現(xiàn)在我們已經(jīng)為應(yīng)用定義了一個布局,接下來讓我們定義繼承該布局的子頁面吧。
定義子頁面的時候,可以使用Blade的@extends
指令來指定子頁面所繼承的布局,繼承一個Blade布局的視圖將會使用@section
指令注入內(nèi)容到布局的片段中,記住,如上面例子所示,這些片段的內(nèi)容將會顯示在布局中使用@yield
的地方:
<!-- 存放在 resources/views/layouts/child.blade.php -->
@extends('layouts.master')
@section('title', 'Page Title')
@section('sidebar')
@parent
<p>This is appended to the master sidebar.</p>
@endsection
@section('content')
<p>This is my body content.</p>
@endsection
在本例中,sidebar片段使用@parent
指令來追加(而非覆蓋)內(nèi)容到布局中sidebar,@parent
指令在視圖渲染時將會被布局中的內(nèi)容替換。
當(dāng)然,和原生PHP視圖一樣,Blade視圖可以通過view
方法直接從路由中返回:
Route::get('blade', function () {
return view('child');
});
可以通過兩個花括號包裹變量來顯示傳遞到視圖的數(shù)據(jù),比如,如果給出如下路由:
Route::get('greeting', function () {
return view('welcome', ['name' => 'Samantha']);
});
那么可以通過如下方式顯示name
變量的內(nèi)容:
Hello, {{ $name }}.
當(dāng)然,不限制顯示到視圖中的變量內(nèi)容,你還可以輸出任何PHP函數(shù),實際上,可以將任何PHP代碼放到Blade模板語句中:
The current UNIX timestamp is {{ time() }}.
注意:Blade的{{}}
語句已經(jīng)經(jīng)過PHP的htmlentities
函數(shù)處理以避免XSS攻擊。
Blade & JavaScript框架
由于很多JavaScript框架也是用花括號來表示要顯示在瀏覽器中的表達式,可以使用@符號來告訴Blade渲染引擎該表達式應(yīng)該保持原生格式不作改動。比如:
<h1>Laravel</h1>
Hello, @{{ name }}.
在本例中,@
符將會被Blade移除,然而,{{?name?}}
表達式將會保持不變,避免被JavaScript框架渲染。
輸出存在的數(shù)據(jù)
有時候你想要輸出一個變量,但是不確定該變量是否被設(shè)置,我們可以通過如下PHP代碼:
{{ isset($name) ? $name : 'Default' }}
除了使用三元運算符,Blade還提供了更簡單的方式:
{{ $name or 'Default' }}
在本例中,如果$name
變量存在,其值將會顯示,否則將會顯示“Default”。
顯示原生數(shù)據(jù)
默認情況下,Blade的{{?}}
語句已經(jīng)通過PHP的htmlentities
函數(shù)處理以避免XSS攻擊,如果你不想要數(shù)據(jù)被處理,可以使用如下語法:
Hello, {!! $name !!}.
注意:輸出用戶提供的內(nèi)容時要當(dāng)心,對用戶提供的內(nèi)容總是要使用雙花括號包裹以避免直接輸出HTML代碼。
除了模板繼承和數(shù)據(jù)顯示之外,Blade還為常用的PHP流程控制提供了便利操作,比如條件語句和循環(huán),這些快捷操作提供了一個干凈、簡單的方式來處理PHP的流程控制,同時保持和PHP相應(yīng)語句的相似。
可以使用@if
,?@elseif
,?@else
, 和?@endif
來構(gòu)造if語句,這些指令函數(shù)和PHP的相同:
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
為方便起見,Blade還提供了@unless
指令:
@unless (Auth::check())
You are not signed in.
@endunless
除了條件語句,Blade還提供了簡單指令處理PHP支持的循環(huán)結(jié)構(gòu),同樣,這些指令函數(shù)和PHP的一樣:
@for ($i = 0; $i < 10; $i++)
The current value is {{ $i }}
@endfor
@foreach ($users as $user)
<p>This is user {{ $user->id }}</p>
@endforeach
@forelse ($users as $user)
<li>{{ $user->name }}</li>
@empty
<p>No users</p>
@endforelse
@while (true)
<p>I'm looping forever.</p>
@endwhile
Blade的@include
指令允許你很簡單的在一個視圖中包含另一個Blade視圖,所有父級視圖中變量在被包含的子視圖中依然有效:
<div>
@include('shared.errors')
<form>
<!-- Form Contents -->
</form>
</div>
盡管被包含的視圖繼承所有父視圖中的數(shù)據(jù),你還可以傳遞額外參數(shù)到被包含的視圖:
@include('view.name', ['some' => 'data'])
Blade還允許你在視圖中定義注釋,然而,不同于HTML注釋,Blade注釋并不會包含到HTML中被返回:
{{-- This comment will not be present in the rendered HTML --}}
@inject
指令可以用于從服務(wù)容器中獲取服務(wù),傳遞給@inject
的第一個參數(shù)是服務(wù)將要被放置到的變量名,第二個參數(shù)是要解析的服務(wù)類名或接口名:
@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>
Blade甚至還允許你自定義指令,可以使用directive
方法來注冊一個指令。當(dāng)Blade編譯器遇到該指令,將會傳入?yún)?shù)并調(diào)用提供的回調(diào)。
下面的例子創(chuàng)建了一個@datetime($var)
指令:
<?php
namespace App\Providers;
use Blade;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
Blade::directive('datetime', function($expression) {
return "<?php echo with{$expression}->format('m/d/Y H:i'); ?>";
});
}
/**
* 在容器中注冊綁定.
*
* @return void
*/
public function register()
{
//
}
}
正如你所看到的,Laravel的幫助函數(shù)with
被用在該指令中,with
方法簡單返回給定的對象/值,允許方法鏈。最終該指令生成的PHP代碼如下:
<?php echo with($var)->format('m/d/Y H:i'); ?>
更多建議: