LoginSignup
3
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-09-17

概要

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>

以上

参考サイト

3
5
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
5