Laravel(5.4)で、バリデーションエラーをフォームにリッチに表示したい時のサンプル(laravelcollective/Forms&HTML使ってる場合)
今日ふとした案件でLaravel触ってみたのですが、Railsのsimple_formにあるような、モデルのバリデーションでコケてる場合にinput要素のクラスにhas-error
を足す良い方法が見当たらなかったので、ざっと作ってみました。
// app/Helpers/FormHelper.php <?php namespace App\Helpers; class FormHelper { public static function text($name, $errors, $options=[]) { if( empty($options['class']) ){ $options['class'] = ''; } if( ! empty($errors->first($name)) ){ $options['class'] .= ' has-error'; } return \Collective\Html\FormFacade::text($name, null, $options); } }
まず、これが今回のメイン。オプションでclass渡してないときに先頭に半角スペース入るけど、別に害がないのでこのままで良いかなと思ってる。
text以外にも使いたいものがあれば適宜勝手に定義すると良いです。 (PHPのメタプログラミングについて調べるほどの情熱はなかった)
次に、このクラスにalias貼る。
// config/app.php // 'aliases' => の後に以下をそれっぽく追加 [ 'FormHelper' => App\Helpers\FormHelper::class, ]
ここまで来たら、あとはblade viewの中から使うだけ。
// form.blade.php // こんな風に使う {!! Form::model($inquiry, ['route' => ['inquiry.preview'], 'method' => 'put']) !!} <div class="form-group"> {!! Form::label('title', 'Title') !!} {!! FormHelper::text('title', $errors, ['class' => 'form-control']) !!} </div> <div class='form-group'> {!! Form::submit('プレビュー', ['class' => 'btn btn-primary form-control']) !!} </div> {!! Form::close() !!}
ちなみに当然だけどコントローラ側で ['inquiry' => new Inquiry]
っぽいことする必要はある。
モデル必要なければ Form::model じゃなく Form::open 使えば良いだけ。
明示的に $errors を渡してるのがダサい。 $errors
の取得については、もっと賢い方法があるかもしれません。 Laravelに詳しい人いたらコメントくれると嬉しいです。
以下、参考にしたリファレンスなど: