1、模板繼承
1)定義模板
示例如下
a)主模板(resources/views/common/layout.blade.php):
<html> <head> <title>@yield('title')</title> </head> <body> @section('topbar') 主頁面頂部內容 @show <div class="container"> @yield('content') </div> </body> </html>
其中@section('xxx')...@show和@yield('xxx')都是用來顯示繼承模板中指定塊的內容的,只是@section('xxx')...@show之間的內容可以被繼承模板通過@parent的方式獲取
b)繼承模板(resources/views/home/home.blade.php):
@extends('common.layout') @section('title', '標題') @section('topbar') @parent <p>子頁面頂部內容</p> @stop
@section('content')
<p>子頁面主體內容</p>
@stop
其中@extends指令用來指定子頁面所繼承的布局,@section('xxx', '內容')和@section('xxx')...@stop用來定義指定塊的內容,@parent用來追加主模板中指定塊原有的內容
2、包含子視圖
Blade的@include指令允許在一個視圖中包含另一個Blade視圖,所有父級視圖中變量在被包含的子視圖中依然有效,如下:
<div> @include('文件夾.子視圖') <form> <!-- Form Contents --> </form> </div>
如果需要傳遞額外的變量,可以通過如下方式
@include('文件夾.子視圖', ['參數名' => '參數值'])
如果要包含一個有可能不存在的視圖,可以使用 @includeIf 指令,如下:
@includeIf('文件夾.子視圖', ['參數名' => '參數值'])
如果包含的視圖取決於一個給定的布爾條件,可以使用 @includeWhen 指令:
@includeWhen($boolean, '文件夾.子視圖', ['參數名' => '參數值'])
要包含給定數組中的第一個視圖,可以使用 @includeFirst 指令:
@includeFirst(['文件夾1.子視圖1', '文件夾2.子視圖2'], ['參數名' => '參數值'])
如果要循環引入多個局部視圖,可以使用 @each 指令:
@each('文件夾.子視圖', $參數數組, '子視圖中的參數名')
在子視圖中,可以通過$子視圖中的參數名獲取$參數數組中對應的值,且可以通過key變量訪問當前迭代的鍵值,如在$參數數組為空時,需要引用其他子視圖的話,可以增加第四個變量,如下:
@each('文件夾.子視圖', $參數數組, '子視圖中的參數名','文件夾.為空時的子視圖')
3、堆棧
Blade 允許你推送內容到命名堆棧,以便在其他視圖或布局中渲染。這方便在子視圖中引入指定JavaScript和css庫,如下:
@push('scripts') <script src="/example.js"></script> @endpush
推送次數不限,要渲染完整的堆棧內容,傳遞堆棧名稱到 @stack 指令即可:
<head> @stack('scripts') </head>
4、服務注入
@inject指令可以用於從服務容器中獲取服務,傳遞給 @inject 的第一個參數是服務對應的變量名,第二個參數是要解析的服務類名或接口名:
@inject('metrics', 'App\Services\MetricsService') <div> Monthly Revenue: {{ $metrics->monthlyRevenue() }}. </div>
5、Blade其他指令
1)可以使用 @if , @elseif , @else 和 @endif 來構造 if 語句,這些指令的功能和 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
2)為方便起見,Blade 還提供了 @unless...@endunless 指令,表示除非,如下:
@unless (1==1) 1!=1 @endunless
3)此外,Blade 還提供了 @isset...@endisset、@empty...@endempty、@switch...@endswitch、@case、@break、@default、@for...@endfor、@foreach...@endforeach、@forelse...@empty...@endforelse、@while...@endwhile等方法,起到判斷和循環的作用,如在循環中,可以通過$loop變量判斷當前循環的狀態,$loop變量的屬性如下:
6、自定義blade指令
如需自定義blade指令,可以在app/Providers/AppServiceProvider.php的boot方法中增加如下代碼:
\Blade::directive('datetime', function($expression) { return "<?php echo date('Y-m-d H:i:s', $expression); ?>"; });
然后在blade模板中通過如下方式引用:
@datetime(1508888888)
注:更新完 Blade 指令邏輯后,必須刪除所有的 Blade 緩存視圖。緩存的 Blade 視圖可以通過 Artisan 命令 view:clear 移除。
如還想自定義if語句,可以在boot方法中通過Blade::if 方法定義:
\Blade::if('env', function ($environment) { return app()->environment($environment); });
在blade模板中使用方式如下:
@env('local') The application is in the local environment... @else The application is not in the local environment... @endenv