バリデーションとは
バリデーションとは、入力データが指定した条件を満たしているか検証するプロセスです。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 | 入力が整数 |
入力がメールアドレス | |
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メソッドを使用した時と同様にバリデーションが設定できます。
今回はバリデーションについて解説しました。次回はダミーデータの作成方法について解説します。