浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【Laravel】/resouces/views 以外の場所にある Blade ファイルを View で扱う

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

  • この記事いいね! (1)