PHP
blade
laravel5.4

LaravelのBladeを拡張する(@alert( ))

More than 1 year has passed since last update.

概要

LaravelのBladeで短い記述で入力エラーのメッセージを表示できるようにしたい。

エラーメッセージのテンプレート作成

下記のようにエラーメッセージの表示を担当するビューを作成する。

resources/views/shared/alert.blade.php
@if($errors->has($key))
    <p class="alert">{{ $errors->first($key) }}</p>
@endif

Include読み込み

Bladeのビューで普通にincludeで読み込んでみる

resources/views/users/create.blade.php
<dl>
    <dt><label for="name">ユーザー名</label></dt>
    <dd>
        <input name="name" value="" placeholder="テスト 太郎" id="name">
        @include('shared.alert', ['key' => 'name'])
    </dd>
</dl>

まあ、これでも悪くはないですが、「shared.alert」を毎回書くことになり、
もし、このファイル名を変更することがあれば、書き直す場所が多くなるので、関数化を検討する。

ServiceProviderを追加する

Bladeを拡張し、alert関数を作る。

app/Providers/BladeServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Blade;
# use Illuminate\View\Compilers\BladeCompiler;
# use Illuminate\View\Compilers\Concerns\CompilesIncludes;

/**
 * Blade拡張
 *
 * @package App\Providers
 */
class BladeServiceProvider extends ServiceProvider
{
    /**
     * コンテナ結合の登録
     *
     * @return void
     */
    public function boot()
    {
        /**
         * 入力エラーメッセージ出力
         *
         * @param   string $name ビュー名
         * @return  string
         */
        Blade::directive('alert', function ($name) {
            $expression = "'shared.alert', ['key' => {$name}]";
            return "<?php echo \$__env->make({$expression}, array_except(get_defined_vars(), array('__data', '__path')))->render(); ?>";
        });
    }

    /**
     * サービスプロバイダー登録
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

新規に作ったクラスを読み込む

config/app.php
    'providers' => [

               
               
               

        App\Providers\BladeServiceProvider::class,

    ],

実行してみる

下記のように各Bladeのテンプレート内で実行してみる

resources/views/users/create.blade.php
<dl>
    <dt><label for="name">ユーザー名</label></dt>
    <dd>
        <input name="name" value="" placeholder="テスト 太郎" id="name">
        @alert('name')
    </dd>
</dl>

以上

参考サイト