入力データのバリデーション

バリデーションとは

バリデーションとは、入力データが指定した条件を満たしているか検証するプロセスです。Laravelではバリデーションを簡単に設定できます。Laravelのバリデーションはvaludateメソッドを使用する方法と、フォームリクエストを使用する方法の二種類があります。ここでは、以前作成したbooksテーブルの作成と更新にバリデーションを適用する方法について解説します。

validateメソッドを使用する

valideteメソッドを使用する場合は、コントローラーでvalideteメソッドを呼び出し、リクエストの中身を検証します。以下のようにBookControllerのメソッドを変更します。

    public function storeBook(Request $request) {
        $validatedData = $request->validate([
            "title" => "required|string",
            "author" => "required|string",
            "price" => "required|integer",
        ]);
        Book::create($validatedData);
        return redirect(route("books.show"));
    }

    public function updateBook(Request $request, Book $book) {
        $validatedData = $request->validate([
            "title" => "required|string",
            "author" => "required|string",
            "price" => "required|integer",
        ]);
        $book->update($validatedData);
        return redirect(route("books.show"));
    }

まず、Requestのvalidateメソッドにバリデーションしたいデータとルールを指定します。データは変数名を指定し、ルールは既に定義されているルールを「|」で複数つなぎ合わせます。主なバリデーションのルールは以下の通りです。

ルール名ルール内容
required入力が必須
string入力が文字列
integer入力が整数
email入力がメールアドレス
min:value入力がvalue以上、もしくは文字列であればvalue文字以上
max:value入力がvalue以下、もしくは文字列であればvalue文字以下

次に、ビューファイルにエラーを表示するように設定します。body開始タグとform開始タグの間に以下のコードを追加します。

    @foreach ($errors->all() as $error)
        <li>{{ $error }}</li>
    @endforeach

バリデーションでエラーが発生するとerrors変数にエラーが格納されるので、それをforeach文で取り出しています。

新規作成画面を開き、何も入力しない状態で登録を行うと、The **** field is required.と表示されます。これは、入力必須なのに入力がされたないことを警告しています。次にpriceに文字列を入力します。すると、The price field must be an integer.と表示されます。これは、整数が入力条件なのに文字列を入力しているからです。

フォームリクエストを使用する

フォームリクエストは以下のコマンドで生成できます。store用とupdate用の二つを作成します。

php artisan make:request StoreBookRequest

php artisan make:request UpdateBookRequest

上記のコマンドを実行するとapp/Http/Requestsに新たにファイルが作成されます。作成したファイルを以下のように変更します。StoreBookRequestもUpdateBookRequestもほぼ同じ内容なので、StoreBookRequest.phpのみ解説します。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreBookRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     */
    public function authorize(): bool
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
     */
    public function rules(): array
    {
        return [
            "title" => "required|string",
            "author" => "required|string",
            "price" => "required|integer"
        ];
    }
}

authorizeはリクエストを送信したユーザーがその実行権限があるかどうか確認するために使用されます。今回は特に指定せず、trueを返して、だれでもアクセスできるようにしています。もし、authorizeがfalseを返す場合は、保存や更新が実行できなくなります。

次に、コントローラーを以下のように変更します。

    public function storeBook(StoreBookRequest $request) {
        Book::create([
            "title" => $request->input("title"),
            "author" => $request->input("author"),
            "price" => $request->input("price"),
        ]);
        return redirect(route("books.show"));
    }

    public function updateBook(UpdateBookRequest $request, Book $book) {
        $book->update([
            "title" => $request->input("title"),
            "author" => $request->input("author"),
            "price" => $request->input("price"),
        ]);
        return redirect(route("books.show"));
    }

以上で設定完了です。validateメソッドを使用した時と同様にバリデーションが設定できます。

今回はバリデーションについて解説しました。次回はダミーデータの作成方法について解説します。

コメントを残す

CAPTCHA