Laravelのバリデーションとは?新人エンジニアが超初心者目線で解説

はじめに

はじめまして!26卒・文系未経験で入社し、3か月間の研修を終えて、7月からシステム開発部で働いている新人エンジニアの未来です。

研修中に「この仕組み、すごいなあ」と感じたもののひとつが バリデーション でした。

最初は名前の響きから「バリア(barrier)みたいに何かを防いでくれるやつかな」と思っていました。実際には barrier ではなく validate(=検証する) が語源で、やっていることは「入ってきた値が正しいかどうかを確かめる」ことです。

この記事では、超初心者の目線のまま 書き残しておきます。

同じようにこれからエンジニアを目指す方、研修中でモヤモヤしている方の役に立てば嬉しいです!

使用言語 / フレームワーク:PHP8.3 / Laravel11

参考:https://laravel.com/docs/11.x/validation

そもそもバリデーションって何?

バリデーション(validation)=入力された値が正しいかどうかをチェックすること です。

日本語だと「検証」「入力チェック」と呼ばれます。

日常生活でこういう経験はありませんか?

  • 会員登録でメールアドレスを空欄のまま送信 → 「必須項目です」と表示されて先に進めない
  • 電話番号に間違って名前を入力 → 「数字で入力してください」と表示される

あの「先に進めず引っかかる仕組み」が、まさにバリデーションです!

「なんでわざわざチェックするの?」

① データベースへの適切ではないデータの挿入を防げる

タイトルが空っぽのデータ、URL欄に「あああ」と入っているデータ。こういうものが1件でも混ざると、一覧画面の表示が崩れたり、リンクをクリックしても飛べなかったりします。入り口で止めておけば、あとで直す必要がありません。

② セキュリティ上の理由

フォームは「誰でも自由に文字を送り込める入り口」です。悪意のある人が変なデータを送ってくる可能性もあります。バリデーションは、その入り口に立つ門番のような役割を果たします。

③ 後の処理を安心して書ける

バリデーションを通した後のデータは「チェック済みの綺麗なデータ」なので、その先の処理で「もし空だったら…」「全然違うものが入ってきたら……」と身構えなくてよくなります。 コードがシンプルになって可読性も上がります!


どうやって書くの?

自分でツールを作ってみたときに、実際に書いたコードがこちらです。

public function store(Request $request) 
{
    // 入力内容をバリデーションして、現在ログインしているユーザーのリンクに1件保存 
    Auth::user()->links()->create($request->validate([ 
        'title' => 'required', 
        'url'   => 'required|url', 
        'memo'  => 'nullable',
    ]));

    // 一覧へリダイレクト 
    return redirect()->route('links.index');]
}

たった数行ですが、この中で

  1. 入力チェック
  2. 保存
  3. 画面遷移

の3つが動いています。

順に解説していきます!

上のコードは、書き方が違うだけで下のコードとまったく同じ意味 です。

public function store(Request $request)
{ 
    // まずバリデーション。チェック済みデータを変数に入れる 
    $targetData = $request->validate([ 
        'title' => 'required', 
        'url'   => 'required|url', 
        'memo'  => 'nullable', 
    ]);
 
    // 現在ログインしているユーザーのリンクに1件保存 
    Auth::user()->links()->create($targetData); 

    // 一覧へリダイレクト 
    return redirect()->route('links.index'); 
}

初心者のうちは、まずこの「分けて書いた版」で理解するのがおすすめ です。私も分けて書いてみて、少しずつ読めるようになりました。

なお、変数名の $validated は「検証済み」という意味で、Laravelの公式ドキュメントや現場のコードでもよく使われている名前です。


コードを1行ずつ読み解く

まだよくわからない人のために、ここからは1行ずつゆっくり見ていきます!

$request->validate([...])

フォームから届いたデータを検証します。ルールはこう書きました。

項目 ルール 意味
title required 必ず入力されていること
url required|url 必須、かつURLの形式であること
memo nullable 空でもOK

|(パイプ)で区切ると、複数のルールを同時に指定できます。 required|url は「必須 かつ URL形式」という意味です。

もしこのルールに引っかかった場合、Laravelが自動的に入力画面へ戻してくれます!

Auth::user()->links()->create()

これは3つのパーツを分解すると分かりやすいです。

  • Auth::user() … 現在ログインしているユーザー
  • ->links() … そのユーザーが持っているリンク集
  • ->create() … そこに新しくデータを1件作る

つなげて読むと 「今ログインしている人の、リンク集に、新しく1件作る」 となります。

英語の文章を読むみたいだと気づいてから、暗号みたいに見えていたものが急に読みやすくなりました。

return redirect()->route('links.index')

保存が終わったら、一覧画面(links.index)へ移動します。


なんでバリデーションが先に動くの?

ここが、私が最初にいちばん混乱した部分です。

Auth::user()->links()->create($request->validate([...]));

このコード、左から読むと create() が先 に見えます。でも実際は「バリデーションしてから保存」という順番で動く。

なぜでしょうか?

答え:カッコの中身が確定しないと、外側は実行できないから

小学校で習った算数を思い出してみてください。

2 × (3 + 4) = 14

このとき、先に計算するのは (3 + 4) の部分 ですよね。カッコの中を計算して 7 にしてから、2 × を実行します。

プログラミングもまったく同じです。

create( $request->validate([...]) )
       └── カッコの中身 ──┘

create() を実行するには、まず渡す中身が確定していないといけません。 だから先にカッコの中の validate() が動き、その結果が出てきてから、それを持って create() が動くわけです。

よく使うバリデーションルール

今回使った3つ以外にも、よく使うルールをいくつか紹介します。

ルール 意味 使いどころ
required 必須入力 名前、タイトルなど
nullable 空でもOK メモ、備考など
url URL形式 URL
email メールアドレス形式 会員登録など
integer 整数であること 数量、年齢
max:255 255文字以内 テキスト、メモ
min:8 8文字以上 パスワード

たとえばタイトルに255文字以内の文字数制限をつけたいなら、こう書けます。

'title' => 'required|max:255',

まとめ

最後に、この記事のポイントを振り返ります。

  • バリデーションは「入力された値が正しいかチェックする仕組み」。データを綺麗に保ち、セキュリティを守り、後の処理をシンプルにしてくれる。
  • $request->validate() は、失敗すれば自動で入力画面へ戻し、成功すればチェック済みの配列を返してくれる。
  • コードの実行順は「カッコの中身が先」。算数の計算と同じルール。

これからエンジニアを目指すあなたに伝えたいこと

初めてコードを見たときは、本当に暗号にしか見えませんでした。

でも実際は、算数のカッコの優先順位だったり、英語の語順だったりと、学校で習ってきたことと同じような考え方ができます。

新卒エンジニアの皆さん、これからエンジニアを目指す皆さん、同じように何もわからないところから始める方の参考になれば嬉しいです!

ここまで読んでいただき、ありがとうございました!

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
3
3
20
X facebook はてなブックマーク pocket

この記事をかいた人

About the author