Laravelでバリデーションを実装するサンプルプログラム

プロミディア合同会社の斉藤です。

今回はPHP Laravelを使って、バリデーションを実装する方法を解説します。

バリデーションは、ほとんどのWebアプリケーションで使われる機能ですので、この記事を読んで理解を深めてください。

 

記事内ではバリデーションの部分だけ解説するので、全ソースが欲しい方はGitHubに上げたソースコードをご覧ください。

 

完成イメージ

Laravelでバリデーションの完成イメージ

 

Laravelでバリデーションを実装するための概要

Laravelではフォームリクエストという機能を使ってバリデーションを実装します。

厳密にはフォームリクエストを使わずに、コントローラ内に記述することもできるのですが、それだとコントローラ内に処理とバリデーションが混在してしまい、可読性が悪くなります

ですので、基本的にバリデーションはフォームリクエストを使うものであると覚えておきましょう。

 

また、バリデーションの代表的なチェックパターンはフレームワーク側で用意されているので、普通のチェックであれば簡単に実装できます。

 

今回使用するバリデーションのチェックパターン

今回のサンプルプログラムでは、よくありそうなチェックを入れてみました。

  • 未入力
  • メールアドレス
  • 数値の範囲指定
  • 文字数制限
  • ラジオボタンでの必須撰択
  • 英語以外の文字が含まれている

用意されているバリデーションの全パターンについては、下記の公式サイトを参照してください。

使用可能なバリデーションルール

 

フォームリクエストでバリデーションが実行されるタイミング

コントローラの引数に通常のリクエストではなく、作成したバリデーションのリクエストを指定するとコントローラに入ってくる前にバリデーションが実行されるようになります。

詳しくは後ほど出てくるソースコードをご覧ください。

 

フォームリクエストを使うメリット

  1. バリデーションの実装だけをコントローラから分離できる
  2. 日本語で独自のエラーメッセージを表示することができる

 

バリデーションの実装

今回のサンプルプログラムでは、単純に1画面だけの入力フォームで解説していきます。

各項目のバリデーション内容がわかるように、ラベルに書いておきました。

※Formファサード、Bootstrapを使用していますが、その部分の解説は省略しています。

ルーティング

ルートは下記の2つのみです。

routes/web.php

バリデーションする側のみメソッドの引数の型を変えるので、メソッドはgetとpostで別にする必要があります。(最初、一緒のメソッドにしてハマりました)

 

フォームリクエストの作成

プロジェクトフォルダ直下でターミナルから下記コマンドを実行して、バリデーション用のクラスを作成します。

php artisan make:request ValidateTestRequest

※リクエストの名前は任意でつけてください。今回は「ValidateTestRequest」という名称にしています。

 

フォームリクエストの実装

初期状態から

  • authorize
  • rules
  • messages

を今回の仕様に合うように書き換えます。

 

app/Http/Requests/ValidateTestRequest.php

 

※text1などは各コントロールのid値です。

 

エラーメッセージを日本語で表示させる

エラーメッセージを日本語で表示させるには、FormRequestのmessagesメソッドをオーバーライドします。

書き方については上記のrulesとmessagesの対応を見ていただけたらわかるかなと思います。

 

コントローラの実装

createメソッドの引数の型をValidateTestRequestに変更することで、POSTのときのみバリデーションが行われるようになります。

app/Http/Controllers/ValidateTestController.php

 

ビューの実装

ビューでは、エラーがあったときだけ、エラーメッセージを表示する実装とするのがポイントです。

resources/views/create.blade.php

※フォーム部分のみ抜粋

$errors->hasでその項目にエラーがあるかチェックし、あるのであれば、$errors->firstで最初の1件を取り出しています。

今回は使いませんが、全部のエラーを取り出したければ$errors->allを使用します。

@if ($errors->has(‘text1′))
<p class=’error-string’>{{ $errors->first(‘text1’) }}</p>
@endif

 

ダウンロード

今回解説したサンプルプログラムをGitHubにアップロードしました。

https://github.com/SadayoshiSaito/validate_sample

 

この記事を書いた人

斉藤 貞義

プロミディア合同会社代表。
会社員として約13年間、ソフトウェア開発の経験を積み2015年にPE-BANKに所属して独立。
システムの受託開発をメインとしながら、プログラミングスクール講師、Udemy講師、アフィリエイトサイト(30代のプログラミングスクール選び)の運営も行っている。