LoginSignup
3
1

More than 3 years have passed since last update.

【Laravel】カスタムディレクティブを定義し、タイトル補完処理をviewから呼び出す

Last updated at Posted at 2020-03-09

環境

  • 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-blade

Bladeではdirectiveメソッドを使い、自分のカスタムディレクティブを定義できます。Bladeコンパイラがそのカスタムディレクティブを見つけると、そのディレクティブに渡される引数をコールバックへの引数として呼び出します。

Note: Bladeディレクティブのロジックを更新した後に、Bladeビューのキャッシュを全部削除する必要があります。view:clear Artisanコマンドで、キャッシュされているBladeビューを削除できます。

実装

full_titleディレクティブを定義します。
引数が無い場合はサイト名をそのまま返し、引数がある場合は「タイトル | サイト名」の形式で返します。
どうやらPHPタグを返さなきゃいけないようなのでそうします。
(参考: https://www.slideshare.net/ShoheiOkada/laravel-blade-107130164

app/Providers/AppServiceProvider.php

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
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1