Laravelでバリデーション(Validate)する正しい方法と注意点

たとえばPOST送信されたデータに対して・・・

  • 値が整数値かどうかとか、
  • 必須の値が代入されているかとか、
  • 値の桁数がはみ出てないかとか、

そういうバリデーションチェックについて。

これにはValidatorという便利なクラスがあります。

その使い方にようやく慣れてきたので、
忘備録も兼ねて方法とかコード例を書いておきます。

POST時にはバリデーションチェックが必要になる

例えばこんなControllerがあるとします。

▼ POST送信を使うようなコード例

このコードの問題点は何でしょうか?

それは次のような所です。

  • ほぼどんな値でも入ってしまう
  • 中途半端なバリデーション

例えば $user_id  では「0より大なりなら」という条件でやってますが、実質的には文字列でも何でも入ってしまいます。(もちろんカラム成約があるからテーブルに反映されないものの・・・)

また $conten  においては「空ではないなら」というガバガバ条件です。これではユーザーが送信したコンテンツが途中で途切れるかもしれません。

だからバリデーションチェックが必要です。

LaravelではValidatorを使ってチェックできる

具体的なバリデーションのやり方について

簡単なのはValidatorを使う方法です。

▼ このようなコードを書けばOK

このコードのように 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()  を使ったとき

例えば次のようなコードも書けます。

これでもバリエーションまでは上手くいきます。

ただし失敗時には自動でエラー処理が行われます!

そのため次のエラーが出てしまいました...

▼ こういうエラーに遭遇!

▼ エラーの原因はRequest::validateにあり

Illuminate\Http\Requestオブジェクトによって提供されるvalidateメソッドを使用します。バリデーションルールにパスすると、コードは正常に実行され続けます。しかし、バリデーションに失敗すると例外が投げられ、適切なエラーレスポンスが自動的にユーザーに返送されます。

引用元 : https://readouble.com/laravel/8.x/ja/validation.html

これは僕も引っかかってしまいました。

素直に Validator::make() を使う方がいいです。

バリデーションチェックは欠かさず行いたい

クライアント側でのチェックも大事です。

▼ こういう未入力項目チェックだったり

とはいえ・・・最終的にデータベースに反映したりといった処理はサーバー側なので、必ずバリデーションチェックは怠らないようにしたいですね。

今紹介したValidatorを使うのがベストです。

以上、Laravelでのバリデーションチェックでした。ではまた

Shareこの記事をシェアしよう!

Commentsこの記事についたコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください