Laravel でコンマ区切りのフォームデータを良い感じにバリデーションする
はじめに
/events?areas=1,2,3
のような URL で検索などの処理を行う際に、良い感じにバリデーションする方法を調べた。
※なるべく自前で各値が DB の値と一致するかを検証したくないよね、というお話。
TL;DR
prepareForValidation
内でデータを変更すると幸せになれるgetValidatorInstance
でもいけるかも(試してない)
目次
環境・条件
1 | $ sw_vers |
詳細
prepareForValidation
を使って解決する。
前置き: バリデーションについて
Laravel では FormRequest のルールで配列の検証も簡単に実現できる。
配列の中身が DB に存在するかの検証も合わせて行うことができる。
1 | class EventSearchRequest extends FormRequest |
課題: URL について
ただし、そのまま恩恵に与ろうと思うと、下記のような URL を使う必要がある。
※POST などのフォームというよりは、検索など GET 系に主眼を置いている。
1 | /events?areas[]=1&areas[]=2&areas[]=3 |
もっとシンプルに /events?areas=1,2,3
のような URL としつつ、値が DB に存在するかどうかも検証したい。
解決方法: prepareForValidation を使う
そのような場合は prepareForValidation
を使ってこうすると良い。
1 | class EventSearchRequest extends FormRequest |
これで areas = '1,2,3'
が、バリデーション実行時には areas = [1, 2, 3]
のように配列に変換された状態となり、各項目が DB に存在するかも検証できる。
その他のやり方
試してないが、getValidatorInstance
を使う方法でもいけるっぽい。
- [PHP][Laravel] バリデーション前にデータを修正する - 1分技術ブログ
- php - Laravel 5 Form Request data pre-manipulation - Stack Overflow
まとめ
prepareForValidation
内でデータを変更すると幸せになれるgetValidatorInstance
でもいけるかも(試してない)
その他・メモ
前に以下の記事を書いたが、prepareForValidation
を使うともっとシンプルに書けそう。
Laravel で「開始日時 < 終了日時」であることをバリデーションする
参考文献
- prepareForValidation - Illuminate\Validation\ValidatesWhenResolvedTrait | Laravel API
- 【Laravel】フォームリクエストFormRequestでバリデーション前に入力値(Request)を整える - Qiita
- php - Laravel validation - comma separated string input as array - Stack Overflow
- php - How do I validate an array of integers in Laravel - Stack Overflow
関連記事
- Laravel で現在の URL 取得方法まとめ
- Laravel で Cookie を使う(参照/設定/削除)
- Laravel で PDF ファイルをブラウザで開く
- Laravel で withCount と having を使って絞り込み
- Laravel で「開始日時 < 終了日時」であることをバリデーションする
- Laravel で生 SQL を実行
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア