CLOSE
MENU
Laravel 基礎学習/Request と Validation の仕組みと書き方

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 文字数・桁数を固定
email メールアドレス形式
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'

この例では、

の両方をチェックしている。

配列形式で書く方法

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 は、
入力内容をチェックする仕組み。

特に重要なのは以下の機能。

これらを理解すると、
Laravel のフォーム処理の流れがかなり分かりやすくなる。

まずは簡単な投稿フォームを作成し、
Request と Validation の基本的な使い方を身につけることが重要。