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 を好きにまとめられます。