Laravelではバリデーションを簡単に実装する仕組みが用意されています。
この記事ではLaravelバージョン11でバリデーションを実装する方法をご紹介します。
- Laravelバージョン11でバリデーションを実装する基本的な方法
- バリデーションのエラーメッセージのカスタマイズ方法
- フォームリクエストを利用して高度なバリデーションカスタマイズを行う方法
Webアプリを開発するならバリデーション実装は必須です!
この記事が少しでもお役に立てば何よりです。
バリデーションとは?
まずは「そもそもバリデーションとは何か?」、 「その役割とは?」についてお伝えします。
バリデーションとは、簡単にいうとユーザの入力値が意図した値になっているかどうかを検証することです。
そんなバリデーションの具体的な役割は以下の通りです。
- ユーザの入力値を制御することでWebアプリにおけるデータの整合性を保つ
- 悪意あるユーザからのセキュリティ攻撃を予防する
バリデーションを実装することでWebアプリを安全に稼働できます。
【基本】バリデーションの実装方法
本章よりLaravelバージョン11でバリデーションを実装する方法を解説します。
バリデーションの実装方法を解説する上で、入力フォームやそこからの値を受け取りデータベースへ保存する処理などがあると話が進めやすいため、この記事では以下の例をイメージしながら解説していきます。
この記事で扱うWebアプリと処理の例
- TODOアプリ
- タスクの登録処理
上記の例にそって、以下よりルーティングやコントローラーなどのソースコードをご紹介していきます!
ルーティング
// タスク登録ページを表示するルーティング
Route::get('/tasks/create', [TasksController::class, 'create'])->name('tasks.create');
// タスク登録処理を実行するルーティング
Route::post('/tasks/create', [TasksController::class, 'store']);
バリデーションルールの設定
/*
* タスク登録ページ(create.blade.php)を表示
*/
public function create()
{
return view('tasks.create');
}
/*
* タスク登録処理
*/
public function store(Request $request, Task $task)
{
// バリデーションルール(★)
$validated = $request->validate([
// 【形式】'$requestのキー名(name属性名)' => 'ルール1|ルール2……',
'title' => 'required|max:50',
]);
// タスク登録処理
$task->title = $request->title;
$task->save();
return redirect()->route('tasks.index'); // タスク一覧ページへリダイレクト(※本記事ではページファイル省略)
}
上記の例では、title
に以下2つのバリデーションルールを適用しています。
- required(入力必須)
- max:50(50文字まで入力許可)
このように、Laravel11ではデータベースへの保存処理の前にバリデーションルールを記述することで、そのデータに対して簡単にバリデーションを実装することが可能です。
エラーメッセージの出力
続いて、バリデーションによって入力エラーが発生したときに出力するエラーメッセージについて解説します。
エラーメッセージの出力方法は大きく2つあります。
- エラーメッセージを項目ごとにひとつずつ出力する
- 複数項目のエラーメッセージを一か所にまとめて出力する
方法① エラーメッセージを項目ごとにひとつずつ出力する
<form action="{{ route('tasks.create') }}" method="post">
@csrf
<p>
@error('title')
<div class="alert alert-danger">{{ $message }}</div>
@enderror
<label for="title">タイトル</label>
<input type="text" name="title" value="{{ old('title') }}">
</p>
<input type="submit" value="登録">
</form>
@error('DB上のカラム名')
を使用することで、該当項目のバリデーションエラーが発生したときにエラーメッセージを出力することが可能です。
また、value属性にold('name属性の値')
のように記述しておくことで、エラー発生時に入力されていた値がフォームに保持されるようになります。
※old('name属性の値')
が無いとエラーが発生する度に入力内容が消えてしまい、再入力の手間が増えます。
方法② 複複数項目のエラーメッセージを一か所に出力する
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action="{{ route('tasks.create') }}" method="post">
@csrf
<p>
<label for="title">タイトル</label>
<input type="text" name="title" value="{{ old('title') }}">
</p>
<input type="submit" value="登録">
</form>
@if ($errors->any())
でエラーメッセージの有無をチェックしています。
もしバージョンエラーがあれば、@foreach ($errors->all() as $error)
でループを回して、エラーメッセージをひとつずつ出力します。
また、value属性にold('name属性の値')
のように記述しておくことで、エラー発生時に入力されていた値がフォームに保持されるようになります。
※old('name属性の値')
が無いとエラーが発生する度に入力内容が消えてしまい、再入力の手間が増えます。
このように、バリデーションエラーによるエラーメッセージの出力方法は大きく2つあります。
ただ、エラーが発生した項目ごとにエラーメッセージを出力した方が、ユーザにとっても分かりやすいと思うので、個人的には①の方法を使用する機会が多いのではないかと思っています。
エラー内容をカスタマイズする
本章では、そのファイルの用意方法を含め、エラーメッセージ・項目名のカスタマイズ方法を解説します。
STEP1 日本語向けのバリデーション用ファイルを用意する
php artisan lang:publish
上記のコマンドを実行すると、プロジェクトディレクトリ直下にlang/en
ディレクトリが生成されます。
このをen
をlang
直下で複製し、そのディレクトリ名をja
とします。
なお前提として、プロジェクトディレクトリ直下の.env
ファイル内でAPP_LOCALE=ja
となっている必要があります。
※初期値は「en」になっており、この状態だとlang/en
ディレクトリが参照されてしまいます。
STEP2 エラーメッセージのカスタマイズ
エラーメッセージをカスタマイズするときは、ja
内のvalidation.php
を編集するとお伝えしました。
例えば、required
ルールによるエラーメッセージを編集するときは以下のようにします。
// 変更前
'required' => 'The :attribute field is required.',
// 変更後
'required' => ':attribute は必須です。',
:attribute
の部分には、エラーが発生した項目名が自動設定されます。
STEP3 項目名のカスタマイズ
エラーメッセージ上の項目名は、デフォルトだとデータベースで使用しているカラム名になります。
しかし、それでは「titleは必須です」のようなメッセージとなり、ユーザにとって分かりづらい内容になってしまいます。
そこで、本節では項目名のカスタマイズ方法をご紹介します!
validation.php
の下の方にあるattributes
へ、以下のように
「キー名(DB上のカラム名) => ‘任意の項目名’」と記述することで項目名を簡単にカスタマイズできます。
'attributes' => [
'title' => 'タイトル',
],
以上のように「バリデーション用ファイル」を用意することで、エラーメッセージが正常に出力されるようになります。
カスタマイズも簡単にできますね!
高度なバリデーションの実装方法
Laravelにはフォームリクエストという、より複雑なバリデーションを実装できるクラスが用意されています。
より複雑なバリデーションシナリオの場合は、「フォームリクエスト」を作成することをお勧めします。フォームリクエストは、独自のバリデーションおよび認可ロジックをカプセル化するカスタムリクエストクラスです。フォームリクエストクラスを作成するには、
make:request
Artisan CLIコマンドを使用します。引用元:Laravel11日本語ドキュメント(https://readouble.com/laravel/11.x/ja/validation.html)
基本的なバリデーション実装では、コントローラーの登録処理メソッド内にバリデーションルールを記載していました。
以下よりフォームリクエストを利用してバリデーションを実装する手順を解説します!
STEP1 フォームリクエストの作成
以下のコマンドを実行することでフォームリクエストファイルが作成されます。
php artisan make:request 任意のフォームリクエストファイル名
実行例
php artisan make:request StoreTaskRequest
STEP2 フォームリクエストファイルの編集
class StoreTaskRequest extends FormRequest
{
/*
* リクエストの認証制御
* ※このメソッドをカスタマイズすることでリクエストの認証範囲を変更できますが、
* 当記事では割愛します。
*/
public function authorize(): bool
{
return true; // falseをtrueへ変更(★)
}
/*
* バリデーションルール
*/
public function rules(): array
{
return [
'title' => 'required|max:50',
];
}
/*
* バリデーションメッセージのカスタマイズ
* (★)手動で追加
*/
public function messages(): array
{
return [
'title.required' => ':attribute の入力は必須です。',
];
}
}
ポイントを解説します。
- authorize()
-
authorize()
はリクエストの認証を制御するためのメソッドです。デフォルトではfalseが返るようになっていますが、このままの状態だと403エラーが発生するため、ここをtrueへ変更してすべてのリクエストが認証されるようにします。
- rules()
-
rules()
にはバリデーションルールを記載します。 - messages()
-
messages()
はバリデーションエラーが発生した際のエラーメッセージをカスタマイズするためのメソッドです。このメソッドを利用することで、前項「エラー内容をカスタマイズする」でご紹介した
validation.php
を使わなくてもエラーメッセージを個別にカスタマイズすることが可能です。フォームリクエストを作成した時点では用意されていないため、手動で追加する必要があります。
STEP3 コントローラーの編集
フォームリクエストファイルでバリデーションを実装したため、コントローラーにはバリデーション関係の処理を書く必要が無くなります。
/*
* タスク登録処理
*/
// public function store(Request $request, Task $task) // 変更前
public function store(StoreTaskRequest $request, Task $task) // 変更後
{
// バリデーションルール(★削除)
// $validated = $request->validate([
// 'title' => 'required|max:50',
// ]);
$task->title = $request->title;
$task->save();
return redirect()->route('tasks.index');
}
今回の例ではStoreTaskRequest型に書き換えています。
このように、フォームリクエストを使用すればコントローラーからバリデーション処理を切り離すことができ、かつより細かな制御をすることができるようになります。
まとめ
以上が、Laravelバージョン11でバリデーションを実装する方法でした。
11以前のバージョンと書き方が同じ箇所もあるかと思いますが、大きな違いは、デフォルトでバリデーションメッセージ用のファイル(lang
)がインストールされていないことです。
Laravelはドキュメントを日本語訳して下さっている方々がいるため、何か困ったことがあればそちらを参照すると大体の問題は解決できるかと思います。
しかし、その方のプログラミング歴によっては、それでもドキュメントを読み解くのは大変なことも多々あるかと思います。(ドキュメントの言い回しはなかなか慣れません……)
今回はそうした方々の一助となればという思いもあり、簡単ではありますが、バリデーションに関する記事を書かせていただきました。
この記事が少しでもお役に立ったなら何よりです!
それでは、最後までご覧いただきありがとうございました!
コメント