Blade は、他の一般的な PHP テンプレート エンジンとは異なり、PHP ネイティブの使用を制限しません。コード。すべての Blade ビューはネイティブ PHP コードにコンパイルされ、変更されるまでキャッシュされます。これは、Blade がアプリケーションのパフォーマンスに与えるオーバーヘッドが基本的にゼロであることを意味します。ブレード ビュー ファイルは、.blade.php ファイル拡張子を使用し、resources/views ディレクトリに保存されます。
Blade を使用する 2 つの最大の利点は、テンプレートの継承とスライスです。まず、「メイン」ページ レイアウトを検出します。ほとんどの Web アプリケーションは異なるページで同じレイアウトを使用するため、このレイアウトは別の 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 ディレクティブに注意してください。前者は名前が示すとおり、コンテンツのフラグメントを定義し、後者は指定されたフラグメントのコンテンツを表示するために使用されます。
アプリケーションのレイアウトを定義したので、そのレイアウトを継承するサブページを定義しましょう。
サブページを定義する場合、Blade の @extends ディレクティブを使用して、サブページによって継承されるレイアウトを指定できます。Blade レイアウトを継承するビューは @section ディレクティブを使用して挿入します。上記の例のように、これらのフラグメントのコンテンツはレイアウト内で @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
この場合、サイドバー フラグメントは次のように使用します。 @parent ディレクティブは、レイアウト内のサイドバーに (上書きではなく) コンテンツを追加します。 @parent ディレクティブは、ビューのレンダリング時にレイアウト内のコンテンツに置き換えられます。
もちろん、ネイティブ PHP ビューと同様に、Blade ビューは view メソッドを通じてルートから直接返すことができます:
Route::get('blade', function () { return view('child');});
変数を括弧で囲んで、ビューに渡されたデータを表示します。 たとえば、次のルートが指定された場合、
Route::get('greeting', function () { return view('welcome', ['name' => 'Samantha']);});
そうすると、name 変数の内容が次のように表示されます。方法:
Hello, {{ $name }}.
もちろん、ビューに表示される変数の内容に制限はありません。実際、任意の PHP コードを Blade テンプレート ステートメントに含めることもできます。
The current UNIX timestamp is {{ time() }}.
注: Blade の { {}} ステートメントは、XSS 攻撃を回避するために PHP の htmlentities 関数によって処理されています。
多くの JavaScript フレームワークでも中括弧を使用してブラウザーに表示される式を表すため、@ 記号を使用して Blade レンダリング エンジンに次のことを指示できます。式は、変更せずにネイティブ形式のままにする必要があります。例:
<h1>Laravel</h1>Hello, @{{ name }}.
この例では、@ 記号は Blade によって削除されますが、{{ name }} 式は変更されず、JavaScript フレームワークによってレンダリングされなくなります。
変数を出力したいが、変数が設定されているかどうかわからない場合は、次の PHP コードを使用できます:
{{ isset($name) ? $name : 'Default' }}
Blade では、三項演算子の使用に加えて、より簡単な方法も提供しています。
{{ $name or 'Default' }}
この例では、$name 変数が存在する場合はその値が表示され、それ以外の場合は「Default」が表示されます。
デフォルトでは、Blade の {{ }} ステートメントは、XSS 攻撃を回避するために PHP の htmlentities 関数によって処理されています。データを処理したくない場合は、次のようにすることができます。次の構文を使用します:
Hello, {!! $name !!}.
注: ユーザー提供のコンテンツを出力するときは、HTML コードを直接出力しないように、ユーザー提供のコンテンツを常に二重中括弧で囲むように注意してください。
Blade では、テンプレートの継承やデータ表示に加え、条件文やループなどの一般的な PHP プロセス制御に便利な操作も提供します。対応する PHP ステートメントとの類似性を維持しながら、PHP フロー制御を処理するクリーンでシンプルな方法です。
@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
は便宜上、Blade は @unless 命令も提供します:
@unless (Auth::check()) You are not signed in.@endunless
条件文に加えて、Blade は PHP でサポートされるループ構造を処理するための簡単な命令も提供します。同様に、これらの命令関数は 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>
含まれるビューは親ビューからすべてのデータを継承しますが、含まれるビューに追加のパラメーターを渡すことができます:
@include('view.name', ['some' => 'data'])
注: __DIR__ 定数と __FILE__ 定数はキャッシュされたビューのパスを指すため、ブレード ビューでは使用しないでください。
Blade の @each ディレクティブを使用すると、1 行のコードで複数の部分ビューをループできます。
@each('view.name', $jobs, 'job')
该指令的第一个参数是数组或集合中每个元素要渲染的局部视图,第二个参数是你希望迭代的数组或集合,第三个参数是要分配给当前视图的变量名。举个例子,如果你要迭代一个 jobs数组,通常你需要在局部视图中访问 $job变量。
你还可以传递第四个参数到 @each指令,该参数用于指定给定数组为空时渲染的视图:
@each('view.name', $jobs, 'job', 'view.empty')
Blade 还允许你在视图中定义注释,然而,不同于 HTML 注释,Blade 注释并不会包含到 HTML 中被返回:
{{-- This comment will not be present in the rendered HTML --}}
@inject指令可以用于从服务容器中获取服务,传递给 @inject的第一个参数是服务将要被放置到的变量名,第二个参数是要解析的服务类名或接口名:
@inject('metrics', 'App\Services\MetricsService')<div> Monthly Revenue: {{ $metrics->monthlyRevenue() }}.</div>
Blade 甚至还允许你自定义指令,可以使用 directive方法来注册一个指令。当 Blade 编译器遇到该指令,将会传入参数并调用提供的回调。
下面的例子创建了一个 @datetime($var)指令格式化给定的 $var:
<?phpnamespace 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 的辅助函数 with被用在该指令中, with方法简单返回给定的对象/值,允许方法链。最终该指令生成的 PHP 代码如下:
<?php echo with($var)->format('m/d/Y H:i'); ?>