LaravelのBladeディレクティブhasStackと高度なスタック制御

最終更新: 5 12月2025
  • Blade は .blade.php テンプレートを純粋な PHP にコンパイルし、条件文、ループ、レイアウト、コンポーネント用のクリーンなディレクティブを提供します。
  • Blade のスタック (@stack、@push、@prepend) を使用すると、スクリプトとスタイルを一元管理し、スタックされている内容を子ビューに委任できます。
  • 環境、承認、セッション、検証のディレクティブは、ビューをフレームワークの残りの部分と安全かつ表現力豊かに統合します。
  • Js::from のようなカスタム ディレクティブとヘルパーは、hasStack のようなディレクティブを含む高度なパターンへの扉を開きます。

LaravelのBlade hasStackディレクティブ

Laravelを日常的に使っていると、遅かれ早かれBlade、そのディレクティブ、そしてもちろんビュースタックや、それらをより良く管理するための仮説的な`hasStack`ディレクティブの概念に出会うでしょう。あなたは従来のPHPテンプレートを使っていたかもしれませんし、ReactやVueに慣れているかもしれません。しかし、Bladeとそのすべての機能(スタックを含む)を真に理解したとき、ビューの構成は飛躍的に向上するでしょう。

この記事では、その複雑な仕組みを詳しく解説します。Bladeの仕組み、制御ディレクティブとは何か、レイアウト、コンポーネント、スロット、属性、認証、環境の構造、そしてその中でスタックの概念とhasStackディレクティブがどのように組み込まれ、レンダリング前にスタックされたコンテンツをチェックできるのかを詳細に見ていきます。これらすべてを、現代のLaravelプロジェクト向けに設計された実践的な例と現実的なアプローチを用いて説明します。

Blade とは何ですか? また、その指令を理解することがなぜ重要なのですか?

ブレードは 公式LaravelテンプレートエンジンPHP の使用を強制的に停止させるわけではありませんが、タグを開いたり閉じたりすることなく、プレゼンテーション ロジックと HTML を混合するための、よりクリーンな構文が提供されます。 いつでも、あらゆるテンプレート .ブレード.php 純粋なPHPにコンパイルされ、 storage/framework/viewsなので、実行時のオーバーヘッドは最小限に抑えられます。

ブレードビューは通常、 リソース/ビュー ルートやコントローラからヘルパーを使って返される view()このヘルパーには、2番目の引数(連想配列、 compact()など)、そしてビューでは、 二重鍵 エスケープされたコンテンツを表示するには ; を使用し、エスケープされていないコンテンツには感嘆符を使用します。

Bladeの大きな利点は、 具体的な指示 (で始まる単語 @)を使用して条件文、ループ、認証、スクリプトスタック、コンポーネント、スロット、検証、環境などを処理することができます。これにより、ビューコードは、従来のPHPと echo プレーン HTML です。

基本的なBlade構文: echo、escape、verbatim

ビューにおける最も一般的な操作はデータの表示です。Bladeでは、変数の内容を出力するには、次のように記述します。 {{ }}内部的には echo e($variable) したがって、 XSSを防ぐためにHTMLエンティティをエスケープする:

エスケープされた変数を表示するのは非常に簡単です。

{{ $name }}

事前に生成された HTML やエスケープ処理をする必要のないコンテンツ (たとえば、自分で制御していて安全だとわかっている場合) を表示したい場合は、{!! !!}という構文を使用できます。この構文は自動エスケープを無効にし、ブラウザにそのまま解釈させます。

{!! $htmlSeguro !!}

キーを使用するフロントエンドフレームワーク(例えば、Vueやクライアントサイドテンプレートライブラリ)を使用する場合、Bladeを使用すると、 自身のエンジンから「脱出」 接頭辞付き @。 このようにして、 @{{ 変数Javascript }} これは Blade 式として解釈されず、ブラウザ フレームワークによって処理される HTML 内に残ります。

Bladeが二重中括弧に手を加えることなく、それらを完全に尊重する必要がある大きなブロックがある場合は、ディレクティブ@verbatim … @endverbatimで囲むことができます。内部のすべては変更されずに残るため、複雑なフロントエンドテンプレートを統合する際に非常に便利なツールです。

制御構造: if、switch、ループ、$loop変数

Bladeは、PHP構文をより読みやすく一貫性のある形でラップする、包括的なフロー制御ディレクティブセットを提供します。実際のロジックはほぼ同じですが、より明確な記述が可能になり、HTML内でPHPタグを過剰に使用することを避けることができます。

if文 と書かれています @if, @elseif, @else そして次で閉じます @endif次のようなショートカットもあります @unless (条件の否定)、 @isset 変数が定義されていることを確認し、 @empty 空かどうかを確認します。

複数の値が可能なシナリオの場合、ディレクティブ @スイッチ PHPのスイッチ構造を複製します @case, @break, @default そして締めくくり @endswitch読みやすい複数の条件文を容易に作成できます。

ループに関しては、 @のために, @foreach y @その間、プラス @forelseこれは、コレクションを反復処理するが、追加の if ステートメントを記述せずに空のリストの場合も処理する必要がある場合に非常に便利です。 @forelse ... @empty ... @endforelse 要素がない場合には代替コンテンツをレンダリングできます。

  Vue.js: それが何なのか、どのように機能するのか、そしてこのフレームワークで何ができるのか

あなたが旅をする時 @foreachBladeは変数を利用可能にする $ループ、現在の反復処理に関する非常に有用な情報を含むオブジェクトです。インデックス、最初のターンか最後のターンか、インデックスが偶数か奇数か、反復処理の合計回数、またはネストされたループの場合は親ループへのアクセスなどです。 $loop->parent.

テンプレートの継承、レイアウト、セクション

実際のアプリケーションでは、すべてのビューでヘッダー、メニュー、フッターを繰り返すことは望ましくありません。Bladeでは、 マスターレイアウト (通常はここに保存されます) resources/views/layouts/master.blade.php)はすべてのページに継承されます。レイアウト内では「空の」領域を定義します。 @yield 残りの一般的な HTML は安定したままです。

子ビューからそのレイアウトを使用するには、 @extends('layouts.master') そして記入したいセクションを宣言します @セクション y @endsection。 それぞれ @yield('nombre') 修士号は @section('nombre') 娘の視点から。

さらに、 @parentディレクティブを使用すると、セクションを上書きできるだけでなく、レイアウトで定義された内容の上または下にコンテンツを追加することもできます。これは、置き換えるのではなく拡張したいサイドバーやブロックで非常に便利です。

完全な継承なしで再利用可能なHTMLスニペットを含める必要がある場合、Bladeは @含む 関連する一連の指令: @includeIf, @includeWhen, @includeUnless y @includeFirstこれにより、条件に応じてサブビューを含めたり、可能なルートのリストに存在する最初のサブビューを選択したりできます。

コレクションの各要素に対して小さな処理を繰り返す場合、@eachディレクティブはforeach と include を 1 行にまとめ、コレクションが空の場合に代替ビューを定義することもできます。

ブレードのコンポーネント、スロット、属性

Bladeコンポーネントは、レイアウトとインクルードの自然な進化形です。再利用可能なインターフェース要素(ボタン、アラート、カード、フォームなど)を、独自のロジック、プロパティ、外部からコンテンツを挿入できるスロットとともにカプセル化できます。構文は、最新のJSフレームワークコンポーネントに非常に近いものです。

コンポーネントには主に2つの種類があります。 階級に基づく (所在地: app/View/Components、生成 php artisan make:component) そしてその 匿名のでのみ見られる resources/views/components 関連クラスなし。どちらの場合も、ビューでは以下のタイプのラベルでレンダリングされます。 <x-alert /> o <x-forms.input />.

クラスベースのコンポーネントは、以下を通じてデータを受け取ります。 HTML属性 (付 kebab-case 視界内に camelCase コンストラクタで定義されるものはコンポーネントビューでパブリックプロパティとして公開され、メソッドを選択できる。 shouldRender() 条件に応じて表示するかどうかを決定します。

柔軟なコンテンツのために、コンポーネントは スロットメインコンテンツへのアクセスは $slot コンポーネントテンプレートで、 名前付きスロット は次のように定義されます <x-slot name="titulo">...</x-slot> コンポーネントを使用する場合、内部からコンポーネントメソッドを呼び出すことができます。 $component スロットが空いているかどうかも確認できる $slot->isEmpty() あるいは、それが本当に内容を持っているかどうか $slot->hasActualContent().

コンポーネントはまた、 追加の属性 コンストラクタのプロパティと一致しない(例えば class, id, data-*これらはすべて、アクセス可能な「属性バッグ」にまとめられており、 $attributesそのままレンダリングすることも、次のような方法で操作することもできます。 merge(), class(), prepend(), filter(), whereStartsWith(), has() o get().

さらに、Bladeには、一般的なフォームHTML用の特定のディレクティブが含まれています。@checked@selected@disabled@readonly、および@requiredは、受け取った条件が真と評価された場合にのみ、対応する属性を出力します。

コンポーネントと従来の継承を使用したレイアウト

現代のLaravelでは、アプリのグローバルレイアウトを次のように定義することがますます一般的になっています。 ブレードコンポーネント (たとえば、 <x-layout>)の古典的な継承のみを使用する代わりに @extendsこのようにして、レイアウトは他のコンポーネントと同様にスロット、属性、プロパティを受け取ることができます。

典型的なパターンはコンポーネントの作成です レイアウト とともに php artisan make:component Layoutテンプレートで基本的なHTML構造(ヘッダー、CSSリンク、ナビゲーション、フッター)を定義し、 {{ $slot }} メインコンテンツを挿入します。オプションで、名前付きスロットを定義します。 title 各ページでタイトルを宣言的に指定できるようにします。

一方、「クラシック」オプションは依然として存在し、 テンプレートの継承 経由 @extends, @section y @yieldこれはコンポーネントが普及する以前から広く使われていました。両方のアプローチを組み合わせて、すべての要素にコンポーネントベースのレイアウトを使用することも、プロジェクトが既にそのように設定されている場合は従来の継承を使用することもできます。

  npm の悪意のあるバージョンの Axios を使用して RAT が配布されている

どちらの場合も、目標は同じです。各ビューでHTMLの骨組みを繰り返すことを避け、レ​​イアウトに関する単一の信頼できる情報源を維持し、各ページがその特定のコンテンツのみに集中できるようにすることです。

Bladeにおけるセッション、認証、環境、認可

Bladeはフレームワークの他の部分と非常にうまく統合されているため、HTMLのレンダリングだけに限定されません。セッション、認証システム、アプリケーション環境、認可ルールとやり取りするための高レベルの指示も提供します。

認証に関しては、 @auth@guestといったディレクティブがあり、それぞれ認証済みユーザーまたはゲストユーザーの場合にのみコンテンツを表示します。さらに、引数として特定のガードを指定することで、使用する認証コンテキストを絞り込むことができます。

ラス 環境指令 として @production o @env('local') これらを使用すると、現在のLaravel環境に応じてビューのセクションを条件付けることができます。例えば、バナー、デバッグトレース、スクリプトなどをローカル環境またはステージング環境のみに表示する場合などに非常に便利です。

セッションに関しては、@sessionディレクティブを使用すると、セッションキーが存在するかどうかを簡単に確認でき、存在する場合は$value変数を通じてその値を取得できます。これにより、フラッシュメッセージやアラートといった典型的なケースをスマートに解決できます。

ポリシーとゲートスタイルの認証については、Bladeは以下を提供します。 @できる, @できません y @cananyこれらを使用すると、モデルやクラスに対する特定のアクションの権限をユーザーが持っているかどうかに応じて、ボタン、リンク、またはブロック全体を表示または非表示にすることができます。 @guest o @authそれにより、より安全で明確なインターフェースの構築が可能になります。

ビュー内のフォーム、検証、エラー処理

静的なビューからフォームに移行すると、Blade の便利さがよくわかります。Laravel では、データを変更するすべてのフォームにCSRF トークンを含める必要があります。非表示フィールドを手動で記述する必要をなくすために、対応するトークンを含む入力フィールドを生成する`@csrf`ディレクティブが用意されています。

HTTPメソッドの例 PUT、PATCH、またはDELETE これらは隠れたフィールドを通じてシミュレートされる _method、そしてBladeはそれをあなたに提供します @メソッド('PUT') (または PATCH/DELETE) を使用すると、フォーム内で自動的に生成されます。

表示するには 検証エラー 指令が存在する @間違い特定のフィールドに関連付けられた変数です。その中で変数を利用できます。 $メッセージ エラーテキストを出力します。これは実際にはコンパイルされたif文なので、 @else エラーがない場合に代替コンテンツを表示します。

オブジェクト $エラー ビューに常に存在し、現在のリクエストのすべての検証メッセージをグループ化します。ヘルパーとシームレスに統合されます。 old()これにより、検証が失敗した後にユーザーが送信した値でフォームを「再入力」することができ、入力内容は保持され、エラーは明確に表示されます。

これらの指示をコントローラーまたはフォームリクエストの検証ルールと組み合わせることで、クライアント側の検証を補完し、悪意のある操作に対してはるかに安全な、堅牢なサーバー側の検証フローが実現します。

Blade のスタック: @stack、@push、@prepend、hasStack の概念

Bladeの機能の中で、あまり話題にはならないものの、大規模プロジェクトにおいて非常に便利な機能の一つにスタックがあります。スタックとは、基本的にビューフラグメントの集合体であり、子ビュー、コンポーネント、またはインクルードからコンテンツを追加し、マスターレイアウト内の特定の位置にまとめてレンダリングすることができます。

`@stack('name')`ディレクティブは、そのスタックに関連付けられたすべてのフラグメントがどこにプッシュされるかを指定します。一方、他のビューからは、`@push('name')`を使用してコンテンツをスタックの末尾にプッシュしたり、`@prepend('name') ` を使用して先頭にプッシュしたりできます。これは、スクリプトやページ固有のスタイルによく使用されます。

例えば、レイアウトに次のようなものがあるとします。 <head> そして最後に <body>:

@stack('styles')
...
@stack('scripts')

そして、追加のJavaScriptが必要な特定のビューでは、次のように記述できます。

@push('scripts')
<script src="/js/pagina-especifica.js"></script>
@endpush

これにより、レイアウト側で各ページのすべてのスクリプトやスタイルを把握する必要がなくなり、スタックのみを定義するだけで済みます。子ビューは必要なものをスタックします。また、`@pushIf`を使用すると、`if` ステートメント全体を記述することなく、ブール条件に基づいてコンテンツをプッシュできます。

このような状況において、多くの開発者は、レンダリング前に特定のスタックにコンテンツが含まれているかどうかを確認できる`@hasStack`のようなディレクティブを懐かしく思っています。Bladeには標準でそのような名前のディレクティブは含まれていませんが、そのアイデアは明確です。「スクリプトスタックが空の場合は、追加のラベルを出力しない」や「メタデータスタックに要素がある場合は、それらを特定のブロックで囲む」といった処理を実行できるようにすることです。

  高品質なソフトウェア開発: それを実現する方法

今日同等の行動を達成する方法は レイアウト内のロジックでスタックディレクティブを補完する またはカスタムヘルパー、あるいは登録済みのディレクティブを使って Blade::directive()この方法では、どの HTML を生成するかを決定する前にスタックを内部的に照会する hasStack ディレクティブをシミュレートできます。

Blade の JSON、JavaScript、ヘルパーディレクティブ

多くのLaravelビューでは、バックエンドからJavaScriptにデータを渡す必要があります。通常、これは次のような処理を伴います。 json_encode() 配列やコレクションをインラインスクリプト内に残すという方法もありますが、これは必ずしも安全で便利というわけではありません。Laravelではヘルパーを使うことでこれを簡単に行うことができます。 Js::from()は、PHP 値をシリアル化し、HTML に埋め込むために JSON に正しくエスケープします。

複雑なデータをブラウザにレンダリングすると、 Js::from() 引用符や特殊文字による問題を回避し、式を返します。 JSON.parse() 属性やスクリプトに組み込んでも安全です。ただし、ディレクティブ内で複雑な式を渡すことは推奨されません。Bladeはコンパイル時に内部的に正規表現を使用するため、予期せぬ動作をする可能性があります。

さらに、Bladeでは、最終的なHTMLには渡されないテンプレートコメント(従来のHTMLコメントとは異なります)や、 @php … @endphpブロックを定義することで、必要不可欠な場合に純粋なPHPの小さなコードスニペットを実行できます。また、@useを使用してクラスをビューにインポートしたり、エイリアスを割り当てたりすることもできます。これは、ヘルパーや特定のコンポーネントを扱う際に便利です。

特定のオブジェクトに対して高度に特化したエコー機能が必要になった場合は、登録することができます。 カスタムエコーハンドラー とともに Blade::stringable()特定のオブジェクトをエコーするときに、Bladeはマジックメソッドの代わりにコールバックを呼び出すようになります。 __toString() クラスの。

エラービュー、フラグメント、カスタムディレクティブ

Laravelでは、 エラービュー: ファイルを作成するだけです resources/views/errors HTTPコードを名前として付けます(例: 404.blade.php o 500.blade.phpエラーが発生するたびに、フレームワークの汎用テンプレートの代わりに、独自のテンプレートが使用されます。

Turboやhtmxなどのツールを使って作業し、 ビューの特定の断片ブレードは指示を出す @フラグメント … @エンドフラグメント 次のような方法と組み合わせて view('...')->fragment('nombre'), fragmentIf(), fragments() y fragmentsIf()この方法では、同じテンプレート全体を再利用し、コンテキストに応じて必要な部分のみを抽出できます。

指令のレパートリーが十分でない場合は、いつでも独自の指令を作成することができます。 ブレード::ディレクティブ()通常は、以下の方法で登録します。 boot() de AppServiceProvider または専用プロバイダ経由でも構いません。Bladeコンパイラはディレクティブ内の式を文字列として渡し、コンパイル時に生成したいPHPコードを返します。

シンプルなカスタマイズ条件の場合は、 ブレード::if()1行で条件付きディレクティブを作成できます。例えば、次のように定義できます。 @disk('s3') アプリのデフォルト ディスクが S3 であるかどうかを確認し、それをネイティブ ディレクティブであるかのように任意のビューで使用します。

このツール群を使えば、ニーズに合わせてほぼ完全にカスタマイズしたテンプレート言語を構築できます。例えば、hasStack 型のディレクティブを追加することも可能です。これは、スタックにコンテンツがあるかどうかを内部的にチェックしてから出力するロジックを、構文糖衣のように簡略化するものです。

Bladeを深くマスターすることで、基本的な構文から高度なコンポーネント、認証ディレクティブ、検証、環境、そして何よりもスタック管理に至るまで、モジュール式で安全かつ一貫性があり、保守しやすいビューを構築できます。将来的にhasStackのようなディレクティブが自然に組み込まれ、レイアウトの各領域に何が注入されるかをさらに完全に制御できるようになります。