ホームページ  >  記事  >  バックエンド開発  >  LaravelのBladeテンプレートエンジンについて詳しく解説

LaravelのBladeテンプレートエンジンについて詳しく解説

黄舟
黄舟オリジナル
2017-10-11 09:06:053355ブラウズ

Laravelのテンプレートエンジンはブレードテンプレートエンジンを使用しており、主にLaravelのブレードテンプレートエンジンに関する情報をサンプルコードを通して詳しく紹介していますので、皆様の学習や仕事の参考になると思います。 . 価値のある方、必要な方は編集者をフォローして一緒に学んでください。

はじめに

この記事では、主にLaravelのBladeテンプレートエンジンに関する関連コンテンツを紹介し、参考と学習のために共有します。これ以上の苦労はせずに、詳細な紹介を見てみましょう。

Blade テンプレート エンジン

Blade は、laravel によって提供されるシンプルで強力なテンプレート エンジンです。Blade ビューをネイティブ PHP コードにコンパイルし、キャッシュします。 Blade ビューが変更されるとキャッシュも変更されます。これは、Blade がアプリケーションにコンパイルの負担を追加しないことを意味します。ブレード ビュー ファイルは .blade.php 接尾辞を使用し、通常は resource/views ディレクトリに保存されます。

テンプレートの継承

まず例を見てみましょう


<!-- Stored in resources/views/layouts/master.blade.php-->
<html>
 <head>
 <title>App Name - @yield(&#39;title&#39;)</title>
 </head>
 <body>
 @section(&#39;sidebar&#39;)
  This is the master sidebar.
 @show
 
 <p class="container">
  @yield(&#39;content&#39;)
 </p>
 </body>
</html>

Blade テンプレート ファイルには、一般的な HTML タグが含まれています。 @section および @yield ディレクティブを見たことがあるはずです。 @section ディレクティブは、その名前が示すようにコンテンツ セクションを定義します。一方、@yield ディレクティブは、提供されたウィジェット セクションに含まれるコンテンツを表示するために使用されます。基本レイアウトを定義したので、Blade の @extends ディレクティブを使用して、このレイアウトを明示的に継承できます。次に、@section ディレクティブを使用してウィジェットのコンテンツをレイアウトにマウントします。上記の例では、ウィジェットのコンテンツはレイアウトの @yield セクションにマウントされます。上記の例では、サイドバー ウィジェットが使用されます。 @parent ディレクティブを使用して、レイアウトのサイドバー部分のコンテンツを追加します。使用しない場合、レイアウトのこの部分は上書きされます。 @parent ディレクティブは、ビューのレンダリング時にレイアウトのコンテンツをコンテンツに置き換えます。


ブレード ビューは、グローバル ヘルパー関数ビューを使用して、ネイティブ PHP ビューと同じようにレンダリングされたコンテンツを返すことができます:


<!-- Stored in resoures/views/child.blade.php -->
@extends(&#39;layouts.master&#39;)
 
@section(&#39;title&#39;, &#39;Page Title&#39;)
 
@section(&#39;sidebar&#39;)
 @parent
 
 <p>This is appended to the master sidebar.</p>
@endsection
 
@section(&#39;content&#39;)
 <p>This is my body content.</p>
@endsection

データを表示します

中括弧 { を使用してビューにパスを表示できますたとえば、ビュー内の変数に対して、次のルートを定義します:

Route::get(&#39;blade&#39;, function () {
 return view(&#39;child&#39;);
});

このように、name 変数の内容をビューに出力できます:


Route::get(&#39;greeting&#39;, function () {
 return view(&#39;welcome&#39;, [&#39;name&#39; => &#39;Duicode&#39;]);
})

もちろん、以下を使用することもできます。ネイティブ PHP メソッドからのコンテンツを返します。実際、Blade echo 宣言では任意の PHP コードを使用できます: (Blade {{}} 宣言の内容は、XSS 攻撃を防ぐために htmlentities メソッドを通じて自動的にフィルタリングされます)。 JavaScript フレームは中括弧を使用して、提供された式をブラウザーに表示する必要があることを示します。 @ 記号を使用して、この式をそのまま保持したいことを Blade レンダリング エンジンに伝えることができます:


Hello, {{ $name }}

値を割り当てるためによく三項演算子を使用します


The current UNIX timestamp is {{ time() }}

Blade は便利な方法を提供しますこの三項演算子のメタ宣言を置き換えるには:


Hello, @{{ name }}

デフォルトの Blade {{}} 宣言は、XSS 攻撃を回避するために htmlentities メソッドを自動的に使用します。データをエスケープしたくない場合は、次の構文を使用できますが、攻撃されることに注意してください:


{{ isset($name) ? $name : &#39;Default&#39; }}

制御構造


@ を渡すことができます。 if 制御構造を使用する if、@elseif、@else、および @endif 命令:

{{ $name or &#39;Default&#39; }}
もちろん、便宜上、Blade は代替命令 @unless 命令も提供します:

Hello, {!! $name !!}

@ も使用できます。レイアウトに何を提供するかを決定するための hasSection 命令 ウィジェットにコンテンツが含まれているかどうか:


@if (count($records) === 1)
 I have one record!
@elseif (count($records) > 1)
 I have multiple records!
@else
 I don&#39;t have any records!
@endif

制御と言えば、PHP と同様にループ構造が不可欠です:


@unless (Auth::check())
 You are not signed in.
@endunless

Blade は反復を終了する命令も提供しますまたは現在の反復をキャンセルします:


<title>
 @hasSection(&#39;title&#39;)
 @yield(&#39;title&#39;) - App Name
 @else
 App Name
 @endif
</title>

you また、命令を使用して包含条件を宣言して中断を実現することもできます:


@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&#39;m looping forever.</p>
@endwhile

サブビューを含める

@include ディレクティブを使用して含めることもできますビューのコンテンツ、および現在のビュー内の変数も子ビューに共有されます:

@foreach ($users as $user)
 @if($user->type == 1)
 @continue
 @endif
 
 <li>{{ $user->name }}</li>
 
 @if($user->number == 5)
 @break
 @endif
@endforeach
子ビューは親ビューからすべてのデータ変数を自動的に継承しますが、配列変数を直接渡して追加のデータを追加することもできます変数を子ビューに追加します (ビュー キャッシュの場所に解決されるため、Blade ビューの __FILE__ 定数で __DIR__ と __DIR__ を使用することは避けてください):

@foreach ($users as $user)
 @continue($user->type == 1)
 
 <li>{{ $user->name }}</li>
 
 @break($user->number == 5)
@endforeach

Blade の @each ディレクティブを使用して、複数のビューを 1 行にマージできます:


<p>
 @include(&#39;shared.errors&#39;)
 
 <form>
 <!-- Form Contents -->
 </form>
</p>

最初のパラメータは、配列またはコレクション内の各要素に対してレンダリングする必要があるビューの名前です。


2 番目のパラメーターは、反復を提供するために使用される配列またはコレクションです。

第三个参数是要分配给当前视图的变量名。

你也可以传递第四个参数到 @each 指令。如果所提供的数组是空数组的话,该参数所提供的视图将会被引入。


@each(&#39;view.name&#39;, $jobs, &#39;job&#39;, &#39;view.empty&#39;)

Blade 中的注释,这样写不会被渲染:


{{-- This comment will not be present in the rendered HTML --}}

Blade 允许你在已命名的堆中压入内容:


@push(&#39;scripts&#39;)
 <script src="/example.js"></script>
@endpush

你可以在你需要的时候压入相同的堆任意的次数,你需要在布局中使用 @stack 来渲染堆:


<head>
 <!-- Head Contents -->
 @stack(&#39;scripts&#39;)
</head>

可以使用 @inject 指令来从服务容器中取回服务:


@inject(&#39;metrics&#39;, &#39;App\Services\MetricsService&#39;)
<p>
 Monthly Revenue: {{ $metrice->monthlyRevenue() }}
</p>

第一个参数将作为所取回服务存放的变量名,

第二个参数是你想要在服务容器中取回的类或接口名称。

可以使用 directvie 方法来注册指令。当 Blade 编译器遇到该指令时,它会自动的调用该指令注册时提供的回调函数并传递它的参数。

下面的例子创建了 @datetime($val) 指令来格式化 $val:


<?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(&#39;datetime&#39;, function ($expression) {
  return "<?php echo with{$express}->format(&#39;m/d/Y H:i&#39;); ?>";
  });
 }
 
 /**
 * Register bindings in the container
 *
 * @return void
 */
 public function register() {
  //
 }
}

上面的例子中使用了 Laravel 的 with 帮助方法,它只是简单的返回一个所提供的对象或值,并提供方便的链式调用。最终该指令生成的 PHP 代码如下:


<?php echo with($var)->format(&#39;m/d/Y H:i&#39;); ?>

在你更新 Blade 指令的逻辑之后,你应该删除所有已缓存的 Blade 视图,你可以使用 view:clear Artisan 命令来清除。

总结

以上がLaravelのBladeテンプレートエンジンについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。