Blade 是 Laravel 所提供的一個(gè)簡單卻又非常強(qiáng)大的模板引擎。不像控制器頁面布局,Blade 是使用模板繼承(template inheritance) 和區(qū)塊(sections)。所有的 Blade 模板后綴名都要命名為.blade.php
。
<!-- Stored in resources/views/layouts/master.blade.php -->
<html>
<body>
@section('sidebar')
This is the master sidebar.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
@extends('layouts.master')
@section('sidebar')
@@parent
<p>This is appended to the master sidebar.</p>
@stop
@section('content')
<p>This is my body content.</p>
@stop
請(qǐng)注意 如果視圖繼承(extend)
了一個(gè) Blade 頁面布局會(huì)將頁面布局中定義的區(qū)塊用視圖的所定義的區(qū)塊重寫。如果想要將頁面布局中的區(qū)塊內(nèi)容也能在繼承此布局的視圖中呈現(xiàn),那就要在區(qū)塊中使用@@parent
語法指令,通過這種方式可以把內(nèi)容附加到頁面布局中,我們會(huì)在側(cè)邊欄區(qū)塊或者頁腳區(qū)塊看到類似的使用。
有時(shí)候,如您不確定這個(gè)區(qū)塊內(nèi)容有沒有被定義,您可能會(huì)想要傳一個(gè)默認(rèn)的值給 @yield。您可以傳入第二個(gè)參數(shù)作為默認(rèn)值給 @yield:
@yield('section', 'Default Content')
Hello, {{ $name }}.
The current UNIX timestamp is {{ time() }}.
有時(shí)候您想要打印一個(gè)變量,但您不確定這個(gè)變量是否存在,通常情況下,您會(huì)想要這樣寫::
{{ isset($name) ? $name : 'Default' }}
然而,除了寫這種三元運(yùn)算符語法之外,Blade 讓您可以使用下面這種更簡便的語法:
{{ $name or 'Default' }}
如果您需要顯示的一個(gè)字符串剛好被花括號(hào)包起來,您可以在花括號(hào)之前加上 @ 符號(hào)前綴來跳出 Blade 引擎的解析:
@{{ This will not be processed by Blade }}
如果您不想數(shù)據(jù)被轉(zhuǎn)義, 也可以使用如下語法:
Hello, {!! $name !!}.
特別注意: 在您的應(yīng)用程序打印用戶所提供的內(nèi)容時(shí)要非常小心。請(qǐng)記得永遠(yuǎn)使用雙重花括號(hào)來轉(zhuǎn)義內(nèi)容中的 HTML 實(shí)體字符串。
@if (count($records) === 1)
I have one record!
@elseif (count($records) > 1)
I have multiple records!
@else
I don't have any records!
@endif
@unless (Auth::check())
You are not signed in.
@endunless
@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
@include('view.name')
您也可以通過傳入數(shù)組的形式將數(shù)據(jù)傳遞給加載的子視圖:
@include('view.name', ['some' => 'data'])
如果想要重寫掉前面區(qū)塊中的內(nèi)容,您可以使用overwrite
聲明:
@extends('list.item.container')
@section('list.item.content')
<p>This is an item of type {{ $item->type }}</p>
@overwrite
@lang('language.line')
@choice('language.line', 1)
{{-- This comment will not be in the rendered HTML --}}
Blade 甚至允許你定義自己的控制語法結(jié)構(gòu)。 當(dāng)一個(gè) Blade 文件被編譯時(shí), 每一個(gè)自定義的擴(kuò)展語法會(huì)與視圖內(nèi)容一起被調(diào)用, 您可以做任何的操作, 簡單如str_replace
以及更為復(fù)雜的正則表達(dá)式。
Blade 的編譯器帶有一些輔助方法createMatcher
及createPlainMatcher
,這些輔助方法可以產(chǎn)生您需要的表達(dá)式來幫助您構(gòu)建自己的自定義擴(kuò)展語法。
其中createPlainMatcher
方法是用在沒有參數(shù)的語法指令如@endif
及@stop
等, 而createMatcher
方法是用在帶參數(shù)的語法指令中。
下面的例子創(chuàng)建了一個(gè)@datetime($var)
語法命令, 這個(gè)命令只是簡單的對(duì)$var
調(diào)用->format()
方法:
Blade::extend(function($view, $compiler)
{
$pattern = $compiler->createOpenMatcher('datetime');
return preg_replace($pattern, '$1<?php echo $2->format(\'m/d/Y H:i\')); ?>', $view);
});