たとえばPOST送信されたデータに対して・・・
- 値が整数値かどうかとか、
- 必須の値が代入されているかとか、
- 値の桁数がはみ出てないかとか、
そういうバリデーションチェックについて。
これにはValidatorという便利なクラスがあります。
その使い方にようやく慣れてきたので、
忘備録も兼ねて方法とかコード例を書いておきます。
このページの目次
POST時にはバリデーションチェックが必要になる
例えばこんなControllerがあるとします。
▼ POST送信を使うようなコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class PostController extends Controller{ public function store(Request $request) { $user_id = $request->post('user_id', -1); $content = $request->post('content', ''); if($user_id > 0 && $content !== ''){ /// postsテーブルを更新... }else{ /// postsテーブル更新失敗 /// エラーコードとかを表示する } } } |
このコードの問題点は何でしょうか?
それは次のような所です。
- ほぼどんな値でも入ってしまう
- 中途半端なバリデーション
例えば $user_id では「0より大なりなら」という条件でやってますが、実質的には文字列でも何でも入ってしまいます。(もちろんカラム成約があるからテーブルに反映されないものの・・・)
また $conten においては「空ではないなら」というガバガバ条件です。これではユーザーが送信したコンテンツが途中で途切れるかもしれません。
だからバリデーションチェックが必要です。
LaravelではValidatorを使ってチェックできる
具体的なバリデーションのやり方について
簡単なのはValidatorを使う方法です。
▼ このようなコードを書けばOK
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public function store(Request $request) { $validated_data = Validator::make($request->all(), [ 'user_id' => 'required|regex:/^[1-9][0-9]*/|not_in:0', /// 「0より大きい正の整数」という条件 'post_id' => 'string|min:1|max:1000:' /// 「1~1000文字の文字列」という条件 ]); if ($validated_data->fails()) { /// バリデーション失敗時の処理... exit; } /// バリデーション成功時の処理... /// テーブル更新とかレスポンスとか } |
このコードのように Validator::make() に対して第1引数に対象のデータ、第2引数に各値へのバリデーション条件を書いていけばOKです。
条件は | で区切ることができ、 'required|regex:/^[1-9][0-9]+/|not_in:0' なら "必須 | 正数のみの正規表現 | 0は含まない" という感じですね。
そしてバリデーションに失敗すると $validated_data->fails() からtrueが返ってくるので、失敗時の処理を書いてあげればOKです。
▼ ちなみにバリデーション条件の書き方
数値・文字列だけではなく、配列・日付・画像ファイル・etc...に対してもバリデーションを行えるみたいです。すごく便利
ただし$request->validate()を使うときは注意が必要
1つだけ注意点があります。
それは Request::validate() を使ったとき
例えば次のようなコードも書けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public function store(Request $request) { $validated_data = $request->validate([ 'user_id' => 'required|regex:/^[1-9][0-9]*/|not_in:0', 'content' => 'string|min:1|max:1000:' ]); if ($validated_data->fails()) { /// バリデーション失敗時の処理... exit; } /// バリデーション成功時の処理... } |
これでもバリエーションまでは上手くいきます。
ただし失敗時には自動でエラー処理が行われます!
そのため次のエラーが出てしまいました...
▼ こういうエラーに遭遇!
1 |
Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException: The POST method is not supported for this route. Supported methods: GET, HEAD. in file C:\xampp\htdocs\example.com\laravel\vendor\laravel\framework\src\Illuminate\Routing\AbstractRouteCollection.php on line 117 |
▼ エラーの原因はRequest::validateにあり
Illuminate\Http\Requestオブジェクトによって提供されるvalidateメソッドを使用します。バリデーションルールにパスすると、コードは正常に実行され続けます。しかし、バリデーションに失敗すると例外が投げられ、適切なエラーレスポンスが自動的にユーザーに返送されます。
これは僕も引っかかってしまいました。
素直に Validator::make() を使う方がいいです。
バリデーションチェックは欠かさず行いたい
クライアント側でのチェックも大事です。
▼ こういう未入力項目チェックだったり
とはいえ・・・最終的にデータベースに反映したりといった処理はサーバー側なので、必ずバリデーションチェックは怠らないようにしたいですね。
今紹介したValidatorを使うのがベストです。
以上、Laravelでのバリデーションチェックでした。ではまた