Blade のカスタムディレクティブについて

あけましておめでとうございます。しましまです。
今回の年末年始は、録画していたM-1グランプリに心を全部もっていかれました。
個人的にレベルの高い年だったなぁと思います。

2025年もよろしくお願いします。

今回は直近の業務で使用したBladeのカスタムディレクティブについてです。

はじめに

ディレクティブはよく皆さん使用すると思います。
@if だったり、 @foreach などがあります。

今回はそれらを拡張できるカスタムディレクティブについてです。

カスタムディレクティブについて

Bladeに表示するデータを表示用に変換したい場合などに便利かなと思います。
私の場合はXSS対策で使用しました。

実装例

◆ AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * アプリケーションの全サービスの登録
     */
    public function register(): void
    {
        // ...
    }

    /**
     * 全アプリケーションサービスの初期起動処理
     */
    public function boot(): void
    {
     // @datetime というカスタムディレクティブ作成
        Blade::directive('datetime', function ($expression) {
            return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
        });
    }
}

◆ index.blade.php(呼び出し例)

<p>@datetime(new DateTime())</p>

◆注意点

Bladeディレクティブのロジック変更後は、キャッシュしたビューを削除する必要があります。
Artisan コマンドを使用して削除しましょう。(php artisan view:clear)

使用した所感

実際に使ってみて、画面側から呼び出し可能な共通部品としてとても便利だと感じました。
もちろん画面に返却する前の段階で表示用にフォーマットすることもできますが、
元のデータも保持しておきたい場合や、フォーマットしたいデータまでの階層が深い場合などに使えると感じました。

ロジックもview側から離して実装できるので、保守もしやすいと思います。