概要
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>
以上