本記事では、Bladeでバリデーションエラーを表示する際のコード記述をスマートに簡略化する方法を紹介します。
先ずこちらが簡略化前です。
@if ($errors->has('title')) <p class="error_msg">{{ $errors->first('title') }}</p> @endif
こちらが簡略化後
{{ Form::error('title') }}
スッキリですね!
簡略化前もたった3行ほどですが、とあるプロジェクトでフォーム20個も30個も書く必要があったので、エラー文もそれと同じ数だけ書く必要がありました。
コピペして直ぐに済むといえば済みますが、できればもっと簡単に書きたい!ということでFormファサードのmacro使用して簡略化しました。
macroをまだ使ったことないという方は、この機会にぜひ使い方を覚えて行ってください。
シンプルなコードなので理解しやすいと思います。
前提としてLaravel Collectiveは既にインストールされているとします。
Laravel Collectiveについての説明はしないので、まだ使用したことがない方はネット検索するとたくさん記事が存在するのでそちらを参考にしてください。
一応こちらがインストールのコマンドです。
composer require laravelcollective/html
それでは実装していきます。
Macroの作成
app\Libs\FormMacro.phpのようにapp直下にディレクトリとファイルを作成してください。
ディレクトリ名とファイル名は特に指定はありません。
ファイルが作成できたら下記のように記述します。
\Form::macro('error', function($name){ $errors = view()->shared('errors'); if( $errors->has($name) ){ return $this->toHtmlString(sprintf('<p class="error_msg">%s</p>', $errors->first($name))); } });
解説
Form::macroを使って独自のメソッドが作成できます。
2行目のerrorがメソッド名です。
sharedを使うと全てのビュー表示に変数errorsが使用できるようになります。
バリデーション時に$errorsにエラーが格納されるので、もしエラーの中に引数のnameがあればtoHtnlStringでbladeで表示させるようにします。
sprintfで%sの部分にエラーを格納します。
class=erros_msg というclassを充てているのでエラー表示のcssは好みで設定してください。
Providerファイルの作成
Provideファイルに先ほどのFormMacroのファイルを登録します。
コマンドで下記を実装するとProviderのファイルが作成されます。
$ php artisan make:provider FormMacroServiceProvider
下記のように記述します。
app/Providers/FormMacroServiceProvider.php
class FormMacroServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { // } /** * Bootstrap services. * * @return void */ public function boot() { require app_path().'/Libs/FormMacro.php'; } }
解説
app_path().'/Libs/FormMacro.phpで先ほどのパスを指定記述します。
因みにここではMacroのファイルを別で作成して、ここに記述してファイルを呼んでしますが、bootの中に直接Macroのソースを記述しても問題なく動作します。
今回のように分けて作成した理由としては、他にもmacroを作成する場合はファイルを分けた方がソースを管理しやすいためです。
configに設定
次にproviderを使えるようにする為、configに設定します。 providersという記述があるところに下記のように追記してください。
config\app.php
'providers' => [ .... //独自マクロ登録 App\Providers\FormMacroServiceProvider::class, ],
以上で、冒頭で記載した方法でエラー表示の実装が可能です。
お疲れ様でした。