LaravelでValidationする方法!

Laravel Laravel

LaravelでValidation(バリデーション)する方法について、書いてみました。

下記の内容について書いています。

・Request(リクエスト)を使ったバリデーションについて
・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を使うと良いかと思います。

コメント

タイトルとURLをコピーしました