環境
- Laravel Framework 6.14.0
やりたいこと
以下Railsチュートリアルのように、タイトル補完用のメソッドを定義しviewから直接呼び出したい。
https://railstutorial.jp/chapters/rails_flavored_ruby?version=5.1#sec-custom_helpers
<title><%= full_title(yield(:title)) %></title>
事前調査
※この用途ならヘルパ関数自作するほうが良さそうなので、以下は参考程度にしてください。
公式ドキュメントによると、カスタムディレクティブを定義すればいけそうです。
処理に変更があった場合、キャッシュの削除が必要みたいです。面倒くさいですね。
Blade拡張
https://readouble.com/laravel/6.x/ja/blade.html#extending-bladeBladeではdirectiveメソッドを使い、自分のカスタムディレクティブを定義できます。Bladeコンパイラがそのカスタムディレクティブを見つけると、そのディレクティブに渡される引数をコールバックへの引数として呼び出します。
Note: Bladeディレクティブのロジックを更新した後に、Bladeビューのキャッシュを全部削除する必要があります。view:clear Artisanコマンドで、キャッシュされているBladeビューを削除できます。
実装
full_titleディレクティブを定義します。
引数が無い場合はサイト名をそのまま返し、引数がある場合は「タイトル | サイト名」の形式で返します。
どうやらPHPタグを返さなきゃいけないようなのでそうします。
(参考: https://www.slideshare.net/ShoheiOkada/laravel-blade-107130164 )
use Illuminate\Support\Facades\Blade;
Blade::directive('full_title', function ($title) {
if ($title === "") {
return "<?php echo 'サイト名'; ?>";
}
return "<?php echo $title.' | サイト名'; ?>";
});
一応、ロジックを更新(追加)したのでビューのキャッシュを削除します。
php artisan view:clear
ビューからよしなに呼び出します。
@section('title')
@full_title('タイトル')
@endsection
引数なしでも動きました。
@section('title')
@full_title()
@endsection
動的な値を渡したいときはこんな感じ。
@section('title')
@full_title($item->id)
@endsection