Blade は Laravel のテンプレートエンジンであり、特別な理由がなければ Laravel でテンプレート的な静的文字列を表現する時、Blade を使います。
Bladeテンプレート 8.x Laravel
この静的文字列は HTML であったり、メールの文面であったり、様々です。Laravel の Blade は基本的に配置されるディレクトリが resources/views と決まっています。これはヘルパー関数の view をはじめとして Laravel 内の多くの Blade を走らせる機能が resources/views をルートとしたルート相対パスでファイルを指すためです。しかしながら resources/views 以外に Blade ファイルを置きたくなる時もあります。例えば次の様なその場限りの通知メールの文面ファイルです。
Mail ├─SomeNotify │ ├─SomeNotifyAction.php │ ├─SomeNotifyCloudStoreMessageTemplate.blade.php │ └─SomeNotifyMailTemplate.blade.php
SomeNotify を実行する PHP ファイルとその通知中で使うテンプレートを一ディレクトリにひとまとめにしています。テンプレートファイルは SomeNotifyAction からのみ呼ばれ、何か SomeNotify を飛ばす必要がある時は都度 SomeNotifyAction を他の場所から呼びます。この他にもモジュール的にディレクトリをまとめたくなる時などもあります。
この様に resources/views 以外に Blade ファイルを置いた場合、次の様なコードを使うことで任意の場所の Blade をコンパイルして、文字列化できます。
/** @var string $viewStr 文字列にコンパイルされた Blade $viewStr = \View::file(// file メソッドで任意のファイルを view 的に解釈 __DIR__.'/../Mail/SomeNotifyMail.blade.php',// Blade ファイルのフルパス ['name' => 'some_one']// 通常の view 同様の Blade に渡す引数 )->render();// render メソッドで文字列化
これで任意の場所に置いた Blade を自由に扱えます。これは便利なのですが、このままではコンポーネント的に Blade を扱えません。これを解決するには次の様な手があります。
$componentStr = \View::file( __DIR__.'/../Mail/Component/SomeNotifyMailMember.blade.php', ['member' => $member] )->render(); /** @var string $viewStr 文字列にコンパイルされた Blade $viewStr = \View::file( __DIR__.'/../Mail/SomeNotifyMail.blade.php', ['name' => 'some_one', 'componentStr'] )->render([)
<!-- SomeNotifyMail.blade.php --> <div class="component-box"> {{ $componentStr }} </div>
コンポーネントをあらかじめ render して置き、親のテンプレートに渡していく形です。こうすることでコンポーネント的に view を構築できます。
これらの様にすることで Laravel のディレクトリ構造に囚われずに view を好きにまとめられます。