LaravelでValidation(バリデーション)する方法について、書いてみました。
下記の内容について書いています。
・Validator(バリデーター)を使ったバリデーションについて
・FormRequest(フォームリクエスト)を使ったバリデーション
・バリデーション結果を画面表示する方法
Request(リクエスト)を使ったバリデーションについて
一番簡単にできるバリデーション方の法だと思います。
LaravelでブラウザからGetやPostリクエストを受けて、画面の入力内容を取得する時にはRequest
クラス(Illuminate\Http\Request)からデータを取得します。
このクラスのvalidationメソッドを呼び出すことによりバリデーションが可能です。
Requestで画面の入力値を受け取る
bladeファイルなど、Laravelで表示される画面の入力項目として、下記のようにinputタグが用意されていたとします。
<input type="text" name="user_name" />
<input type="text" name="age" />
この時にフォームを送信すると、Laravelで入力値を受け取る場合は下記のようになります。
(ルーティングの記載やコントローラーのクラスについては省略しています。)
public function index(Request $request) {
echo $request->user_name;
echo $request->age;
}
上記で、ユーザー名と名前が表示されます。
基本的にLaravelでリクエストを受け取る時には、このようにメソッドの引数にRequest
クラスでリクエストを受けるように引数を記載しておきます。
こうしておくと、受け取った引数の$request
からGetやPostどちらのリクエストの場合でも、入力値を取得することができます。
受け取ったリクエストをバリデーションする
上記で受け取った内容をバリデーションしてみます。
public function index(Request $request) {
$request->validate([
'user_name' => 'required',
'age' => 'required|integer|min:0',
]);
}
このようにvalidate
メソッドを使うと、バリデーションすることが可能です。
解説
メソッドの引数として、連想配列を渡します。
左側にinputタグのname属性の項目を記載して、右側にバリデーション内容を書きます。
バリデーションの内容はLaravelで定義されています。
ここではrequired
と書いていますが、これは必須になります。
age
にはrequired|integer|min:0
としています。これは「必須で入力されていて、入力値が整数値で最小値が0以上であること」をバリデーションしています。
このように複数バリデーションする場合は|
で区切ります。
もしくは、下記のように配列で渡すことも可能です。
public function index(Request $request) {
$request->validate([
'user_name' => ['required'],
'age' => ['required', 'integer', 'min:0'],
]);
}
リクエストがindex
メソッドに入ってきてバリデーションに引っかかると、すぐにブラウザに結果を返します。
HTTPステータス302でフォームを送信した画面に結果が返ってきます。
Validator(バリデーター)を使ったバリデーションについて
次は、Validatorクラスを使ったバリデーションについてです。
Requestを使用した場合は$request->validate
でエラーだった場合は、直ぐにブラウザにバリデーションの結果を返していました。
Validatorを使用すると、直ぐにブラウザに結果を返すことなく、内容によって処理を変えることができます。(例:「エラーの内容を画面に表示せずにログに記録するだけ。」など)
実際にValidatorを使う場合は、下記のように記載します。
Requestのvalidateメソッドを使ったときと同じ処理になります。
public function index(Request $request) {
$validate = Validator::make($request->all(), [
'user_name' => 'required',
'age' => 'required|integer|min:0',
]);
if ($validate->fails()) {
return redirect()->route("test_index")->withErrors($validate->messages());
}
}
解説
Validatorクラスのmakeメソッドを使って、バリデーションしました。
第1引数が$request->all()
となっていますが、これはLaravelに送られるリクエストの配列です。
実際には下記のような配列になります。(user_nameとageは空)
[
"_token" => "grJ0wWlYWUI06l1GJOEL3NWfpUO05LovJkrdg0og"
"user_name" => null
"age" => null
]
第2引数にバリデーションの内容を記載します。これはRequestでバリデーションの内容を記載したときと同じです。
下記のようにfailsメソッドを使うことで、バリデーションした結果エラーか判定できます。
if ($validate->fails()) {
// エラーの場合の処理を書く...
}
そして、実装例ではエラーの場合は画面にエラーメッセージを渡して、リダイレクトするようにしています。
$validate->messages()
でエラーになった場合のメッセージを取得することが可能です。
リダイレクトについては、こちらを参考にしてみてください。
Validatorクラスでのバリデーションについて見て行きました。
Requestのvalidateと違うのは、validateはすぐにレスポンスを返すのに対して、Validatorは直ぐにレスポンスを返してもいいし返さなくてもOKといった感じです。
これにより「エラーだった場合は違う画面にリダイレクトする。」といったように柔軟なバリデーション後の対応が可能です。
FormRequest(フォームリクエスト)を使ったバリデーション
FormRequestを使ったバリデーションについては、下記のリンク先に書きました。
こちらの記事を参考にしてみてください。
FormRequestを使うことで、コントローラーの中身をすっきりさせて、バリデーションだけ別のファイルに定義しておけるイメージになります。
基本的にはFormRequestでリクエストのバリデーションは分けておくほうが良いと思います。
バリデーション結果を画面表示する
下記の内容をbladeファイルに記載しておきましょう。
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
解説
RequestのvalidateやValidatorのwithErrorsでリダイレクトされると、$errosにバリデーションのメッセージが入っています。
anyで空出なかった場合は、表示されるようになっています。
@foreach
でエラーメッセージがある間はループして、liタグでエラーをひとつずつ表示するといった感じです。
エラーメッセージの表示の見た目を変えたい場合は、この@if
の中を修正していく感じですね。
終わりに
今回はLaravelの機能を使ったバリデーションを見て行きました。
基本的にはFormRequestを使って見やすくしておくのが良いかと思います。
バリデーション後に違う画面にリダイレクトしたり、新しくパラメータを増やして戻したりなど
柔軟な対応が必要になる場合にはValidator
を使うと良いかと思います。
コメント