どうもこんばんは。
突然ですが、先日2月15日、RISING SUN ROCK FESTIVALにてNUMBER GIRLの復活が報じられました。
NUMBER GIRLがオリジナルメンバーで復活!「RISING SUN ROCK FESTIVAL 2019 in EZO」第1弾発表
この復活をリアルタイムで知ることができて本当に嬉しい!興奮する!
でも北海道はちょっと遠い…
もしNUMBER GIRLを聴いたことがない方がいれば是非お勧めです。
本題
前回はリレーション定義を行い、リレーションシップに対応した新規作成や一覧画面などの各操作画面を作成しました。
Laravel-adminのコントローラでは、一対多などのリレーションにあるカラムでであっても、
分かりやすく簡単に画面に表示することが可能でした。
そして、バリデーションについても、Laravel-adminではLaravelのバリデーションを活用しつつ、
コントローラで簡単に実装が可能なようなので、実際に試してみることにしました。
Laravel-adminでのバリデーションについて
Laravel-adminの公式ドキュメントに簡単なデモが掲載されています。
上記ページにも書かれている通り、
LaravelのバリデーションルールをLaravel-adminのコントローラの、
記述ルールにのっとっることで指定したバリデーションルールを適用できる、という流れになります。
基本的にはLaravel標準のバリデーションが使用できるようですが、実際にどこまでのことが出来るのか試してみたいと思います。
とりあえずLaravelで可能なバリデーションルールを用途別に検証していきたいと思います。
基本形
以下のようにLaravelのバリデーションルールをformのrules関数の中に記述すれば使用できます。
requiredはもちろんrequired_ifなど入力条件によって必須項目を流動的に制御するバリデーションも設定可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$form->tab('ユーザー情報', function ($form) use ($itemModel) { // 入力必須 $form->text('name', '名前')->rules('required'); // 数値のみ入力可能.最大値100.最小値20 $form->number('age', '年齢')->rules('integer|max:100|min:20'); $form->email('email', 'メールアドレス'); $form->text('address.address', '住所'); $form->text('address.phone_number', '電話番号'); $form->multipleSelect('item', 'アイテム')->options($itemModel::all()->pluck('item_name', 'id')); // 入力値「1」以外許容 $form->radio('living_together', '同居の有無')->options([ 0 => 'はい', 1 => 'いいえ' ])->rules('in:1') // living_together(家族の同居)が1(いいえ)の場合必須 $form->text('family_address', '家族住所')->rules('required_if:living_together,1'); |
hasManyのrequired_if
1 2 3 4 5 6 7 8 9 10 |
public function update($id) { $validator = Validator::make(Input::all(), [ 'family.*.family_hobby' => 'required_if:family.*.family_gender,1', ]); if ($validator->fails()) { return redirect()->back()->withErrors($validator)->withInput(); } return $this->form()->update($id); } |
女性のみ趣味欄が入力必須というトンデモ仕様ですが(笑)、こんな感じでhasManyの項目に対してもバリデーションルールを設定することができます。
エラーメッセージの日本語化&カスタマイズ
バリデーションのメッセージのカスタマイズ方法はいくつかありますが、
バリデーション用の言語ファイルで一括管理すると変更も容易です。
config/app.phpの「locale」を「ja」に変更後、resources/lang/ja配下に、
validation.phpを作成するし、バリデーションメッセージを設定することができます。
試しにバリデーションメッセージを変更します。
1 2 3 4 5 6 7 8 9 10 11 12 |
return [ 'required' = ':attributeは必ず指定してください。', 'in' => ':attributeは:valuesのみ選択可能です。', 'size' => ':attributeは:min以下が設定可能です。', 'min.numeric' => ':attributeは:min以上が選択可能です。', 'required_if' => ':attributeは必ず指定してください', 'custom' => [ 'family.*.family_hobby' => [ 'required_if' => '趣味は必ず指定してください。', ], ], ]; |
一対一のフォームは以下のようになります。
hasManyのバリデーションは以下です。
以上のようにLaravel-adminのフォームにおいてもLaravel標準のバリデーションを十分に使用することができます!
印象としては、hasManyはちょっとやっかいな気がします。
encore配下をガンガンカスタマイズすればもっと自由度は向上しそうですが、
更新で消えてしまいますからなんとも…
プルリクエストはとてもじゃありませんが勇気ありません(笑)
そもそもフレームワークの拡張の理想の運用ってどんな感じなんでしょうね。
encore配下をapp配下にもってきてガンガンカスタマイズするのが普通なんですかね。
みんなプルリクエストって気軽に送ってたりしてんのかなぁ。