Laravel 基礎学習/Request と Validation の仕組みと書き方
Laravel の Request / Validation は、フォーム送信データを受け取り、入力内容をチェックする重要な仕組み。
本記事では、Request の役割や Validation の基本、フォーム処理の流れについて解説する。
Request / Validation とは
Laravel では、
ユーザーが入力フォームから送信したデータを
Request で受け取り、
Validation で入力内容をチェックする。
例えば、
会員登録フォームでは、
- 名前
- メールアドレス
- パスワード
などの入力内容をサーバーへ送信する。
Laravel では、
送信されたデータを Request(リクエスト) で受け取り、
Validation(バリデーション) で内容を確認してから処理を行う。
Request は「データを受け取る仕組み」、
Validation は「入力内容をチェックする仕組み」と考えると分かりやすい。
なぜ Validation が必要か
Validation を行わないと、
下記の様な想定外のデータがそのまま DB に保存される可能性がある。
- 空データ
- 異常な値
- 文字数超過
- 不正な入力
それを防ぐために、
下記の様なルールを設定し、Validation を行う。
- 必須入力か
- 文字数制限を超えていないか
- メール形式か
- 数値か
このように、
Validation はセキュリティ上も重要な役割を担っている。
フォーム送信時の処理の流れ
フォーム送信時、
Laravel では基本的に以下の流れで処理される。
ブラウザアクセス
Route
URL に対応する Controller を決定
Controller
必要な処理を実行
Request
送信されたデータを受け取る
Validation
入力内容をチェックする
Model
DB操作が必要な場合に利用する
View
ブラウザへ表示する HTML を生成
ブラウザへ表示
Request はフォーム送信データを受け取り、
Validation は入力内容をチェックする役割を持つ。
Validation が成功した場合のみ、
DB 保存などの後続処理が実行される。
Request でフォーム送信データを受け取る
Request とは、
ブラウザから送信されたデータを受け取る仕組み。
例えば、
以下のようなフォームからの送信データを受け取る際に使用する。
<form action="/posts" method="POST">
<input type="text" name="title">
<textarea name="body"></textarea>
</form>
なお、Request はテキスト入力だけでなく、
フォームから送信された値全般を扱うことができる。
Request クラスの読み込み
use Illuminate\Http\Request;
Controller 内にこの記述をすることで、
Request クラスを読み込むことができる。
Controller 内で Request クラスを使用することで、
フォーム送信データを受け取ることができる。
Request で値を取得する
Request でフォームの送信データを取得するには、
$request->フォームの name 属性
の形式で記述する。
フォーム
<form action="/posts" method="POST">
<input type="text" name="title">
<textarea name="body"></textarea>
</form>
Request での受け取り
$title = $request->title;
$body = $request->body;
このように、フォームの name 属性を指定し、
フォームから送信されたデータを任意の変数に代入することができる。
ただし、
実際の開発では値を取得してすぐ保存するのではなく、
Validation を行ってから使用することが多い。
Validation で、受け取ったデータをチェックする
Request で受け取ったフォームデータは、
Validation を使って、不正なデータがないかのチェックを受ける。
Validation の基本形
Laravel では、
下記のようにして Validation を行う。
$validated = $request->validate([
'フォームの name 属性' => 'バリデーションルール',
]);
validate() 内に入力ルールを記述することで、
送信されたデータがルールを満たしているかチェックできる。
Validation 記述例
$validated = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
この例では、
title は必須入力かつ255文字以内、
body は必須入力としてチェックしている。
Validation に成功した場合は、
チェック済みデータが $validated に格納される。
Validation の具体的な使用例
フォーム送信からの流れ
フォームから送信されたデータを
Request で受け取り、
Validation でチェックするには、
下記の流れの理解が必要となる。
フォーム送信
Route
実行する Controller と関数を決定
Controller
必要な処理を実行
Request
送信されたデータを受け取る
Validation
入力内容をチェックする
Route で Controller の関数を指定する
まずは、Route で、Controller 内の関数を指定する必要がある。
Route で指定した関数が Controller 呼び出し時に実行されるため、
その中で Request と Validation を記述することになる。
Route::post('/posts', [PostController::class, 'example']);
この例では、
/posts へ POST リクエストが送られた際に、
Controller (PostController.php) 内の example 関数が実行される。
そのため、example 関数内で Request と Validation を記述することで、
フォーム送信データの受け取りとチェックが行われる。
Controller で Request と Validation を使用する
フォームからのデータを
Request で受け取り、
Validation でチェックをするには、
Controller (PostController.php) に下記の様に記述する。
use Illuminate\Http\Request;
public function example(Request $request)
{
$validated = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
}
Request クラスを読み込む
use Illuminate\Http\Request;
Request クラスを使用するための記述。
Controller 内でフォーム送信データを扱えるようになる。
Request を受け取る
public function example(Request $request)
example は、任意で命名した関数名。
Route で指定した関数名と一致させる必要がある。
Route で、example が指定されているので、
Controller の呼び出し時に、この example 関数が実行される。
Request $request には、
フォームから送信されたデータが格納されている。
Validation の実行
$validated = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
Request で受け取ったデータに対して、
Validation を実行する。
例にある title と body は、
フォームの name 属性と一致させる必要がある。
Validation に成功した場合は、
チェック済みデータが $validated に格納される。
Validation に失敗した場合は、
エラーメッセージを保持した状態で前の画面へ戻る。
Validation 成功時と失敗時の動き
Validation 成功時
Validation が成功すると、
処理はそのまま続行される。
例
$validated = $request->validate([
'title' => 'required|max:255',
'body' => 'required',
]);
Validation に成功した場合は、
チェック済みデータが連想配列として $validated に格納される。
$validated = [
'title' => 'Laravel入門',
'body' => 'Requestの勉強',
];
その後、
DB 保存など、必要に応じた処理を行うことができる。
Validation 失敗時
Validation ルールのうち、
1つでもチェックに失敗すると、
Laravel が自動で以下の処理を行う。
- 前の画面へ戻る
- エラーメッセージを保持する
- 入力値を保持する
そのため、
自分でエラー処理を書くことなく、
Validation エラーへ対応できる。
Validation エラーが発生すると、
それ以降の処理は実行されない。
Blade でエラーと入力値を表示する
Validation エラー時は、
Blade 側でエラーメッセージを表示することが多い。
@error を使用する
@error('title')
{{ $message }}
@enderror
title に Validation エラーが存在する場合、
このようにエラーメッセージを表示することができる。
$message には、
Laravel が自動生成したエラーメッセージが入る。
フォームを下記ように記述していれば、
title に Validation エラーがある場合、
入力欄の下へエラーメッセージを表示できる。
<input
type="text"
name="title"
>
@error('title')
<p>{{ $message }}</p>
@enderror
old() を使用する
Validation エラー時、
フォームの入力内容を保持するために old() を使用する。
フォームを下記のように記述することで、
Validation エラー後も入力内容を再表示できる。
<input
type="text"
name="title"
value="{{ old('title') }}"
>
ユーザーが再入力する手間を減らせるため、
フォームでは頻繁に使用する。
よく使う Validation ルール
Laravel では、
様々な Validation ルールを使用できる。
よく使用するルールは以下の通り。
| ルール | 意味 |
|---|---|
| required | 必須入力 |
| nullable | 空入力を許可 |
| max:n | 最大文字数(n文字以内) |
| min:n | 最小文字数(n文字以上) |
| size:n | 文字数・桁数を固定 |
| メールアドレス形式 | |
| url | URL形式 |
| numeric | 数値のみ許可 |
| integer | 整数のみ許可 |
| decimal:n | 小数点以下 n 桁まで許可 |
| boolean | true / false を許可 |
| date | 日付形式かチェック |
| date_format:形式 | 指定形式の日付かチェック |
| before:日付 | 指定日より前の日付 |
| after:日付 | 指定日より後の日付 |
| confirmed | 確認用入力と一致するか |
| same:項目名 | 指定項目と一致するか |
| different:項目名 | 指定項目と異なるか |
| unique:テーブル名 | DB内で重複禁止 |
| exists:テーブル名,カラム名 | DB内に存在する値かチェック |
| in:値1,値2… | 指定した値のみ許可 |
| not_in:値1,値2… | 指定した値を禁止 |
| array | 配列形式かチェック |
| file | ファイルかチェック |
| image | 画像ファイルかチェック |
| mimes:拡張子一覧 | 許可する拡張子を指定 |
| alpha | 英字のみ許可 |
| alpha_num | 英数字のみ許可 |
| alpha_dash | 英数字・ハイフン・アンダースコアのみ許可 |
| regex:正規表現 | 正規表現でチェック |
| json | JSON形式かチェック |
| uuid | UUID形式かチェック |
| timezone | 有効なタイムゾーンかチェック |
| present | 値の有無に関係なく項目の存在を必須にする |
| filled | 値が存在する場合は空文字を禁止 |
n や 項目名、テーブル名、日付 などの部分は任意の値を指定する。
Validation ルールは非常に種類が多く、
本記事では代表的なものを紹介した。
詳細は Laravel 公式ドキュメントを参照すること。
複数ルールを書く方法
Validation ルールは、
| で区切って複数指定できる。
例
'title' => 'required|max:255'
この例では、
- 必須入力
- 255文字以内
の両方をチェックしている。
配列形式で書く方法
Validation ルールは、
配列形式でも記述できる。
例
'title' => [
'required',
'max:255',
]
配列形式の方が、
ルール追加や整形をしやすい場合がある。
Form Request とは
Validation が増えてくると、
Controller のコードが長くなりやすい。
その場合、
Validation を専用クラスへ分離できる。
この仕組みを Form Request と呼ぶ。
作成コマンド
php artisan make:request StorePostRequest
作成場所
app/Http/Requests
作成すると、
Validation 用のクラスが生成される。
なぜ Form Request を使うのか
Validation を Controller へ大量に記述すると、
Controller が読みにくくなる。
Form Request を使用すると、
Validation を Controller から分離できる。
そのため、
実際の開発では Form Request を使用することが多い。
初心者のうちは、
まず $request->validate() を理解し、
慣れてきたら Form Request を学ぶ流れがおすすめ。
Controller で使用する
作成した Form Request は、
Controller の引数へ指定して使用する。
use App\Http\Requests\PostRequest;
public function example(PostRequest $request)
{
// Validation 成功後の処理
}
Request の代わりに、
作成した Form Request クラスを指定する。
これにより、
Controller 実行前に Validation が自動実行される。
まとめ
Request は、
フォーム送信データを受け取る仕組み。
Validation は、
入力内容をチェックする仕組み。
特に重要なのは以下の機能。
- Request
- $request->validate()
- @error
- old()
- Validation ルール
これらを理解すると、
Laravel のフォーム処理の流れがかなり分かりやすくなる。
まずは簡単な投稿フォームを作成し、
Request と Validation の基本的な使い方を身につけることが重要。