【まとめ】Laravel-バリデーションルール一覧

【まとめ】Laravel-バリデーションルール一覧

この記事からわかること

  • Laravelバリデーションルールまとめ

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Laravelでは簡単に入力値のバリデーションが行えるように様々なルールがあらかじめ定義されています。

今回はルールの使い方とよく使うルール項目をまとめました。

Laravelのバリデーションルールの使い方

Laravelのバリデーション機能はコントローラ側からリクエストオブジェクトのvalidateメソッドを使うことで実装可能です。

$request->validate([
    'name' => 'required|string|size:4',
    'email' => 'required|email',
]);

validateメソッドの引数にはフォームで指定したname属性とその項目に適応させたいルールを連想配列形式で渡します。これだけで指定した項目の入力値を自動で検証し、ルールに当てはまらなければエラーレスポンスを返し後続の処理を停止し直前のURLに自動でリダイレクトしてくれます。

ルールは「 | 」で並べることで複数設けることも可能です。左側に並べたものから順番に検証され、エラーが出た順番にエラーメッセージが都度$errors変数に格納されていきます。

格納されたエラーメッセージにはfirstメソッドなどを使って取得することが可能になります。

$errors->first('name属性')

ポイント

ルールはさまざまなものが予め用意されています。

数値に関するルール

整数値かどうか:integer

$request->validate([
    'num' => 'integer',
]);

数値かどうか:numeric

$request->validate([
    'num' => 'numeric',
]);

指定値より大きいか:min : 値

$request->validate([
    'num' => 'integer|min:5',
]);

数値(=値)、文字列(=文字の長さ)、配列(=要素数)の場合も使用可能

数値として使用する際はinput要素type="number"にルールにintegerを指定すると文字列ではなく数値として扱ってくれます。

指定値より小さいか:max : 値

$request->validate([
    'num' => 'integer|max:5',
]);

数値(=値)、文字列(=文字の長さ)、配列(=要素数)の場合も使用可能

指定値と同じかどうか:size : 値

$request->validate([
    'num' => 'integer|size:5',
]);

数値(=値)、文字列(=文字の長さ)、配列(=要素数)の場合も使用可能

指定の範囲内かどうか:between:min,max

$request->validate([
    'num' => 'integer|between:2,10',
]);

指定の桁数かどうか:digits : 値

$request->validate([
    'num' => 'integer|digits:2',
]);

文字列に関するルール

文字列かどうか:string

$request->validate([
    'name' => 'string',
]);

アルファベットのみかどうか:alpha

$request->validate([
    'name' => 'alpha',
]);

アルファベット+「-」+「_」のみかどうか:alpha-dash

$request->validate([
    'name' => 'alpha-dash',
]);

アルファベット+数字のみかどうか:alpha-num

$request->validate([
    'name' => 'alpha-num',
]);

指定の文字数かどうか:size : 値

$request->validate([
    'name' => 'size:4',
]);

数値(=値)、文字列(=文字の長さ)、配列(=要素数)の場合も使用可能

指定の文字から始まるかどうか:starts_with : 文字列

$request->validate([
    'name' => 'starts_with:start',
]);

以下のように:の後に (空白)を入れると空白を含めたスタート文字列のみ許可するようになるので注意してください。

$request->validate([
    'name' => 'starts_with : blank',
]);

指定の文字で終わるかどうか:ends_with : 文字列

$request->validate([
    'name' => 'ends_with:end',
]);

フォーマットに関するルール

URL形式化どうか:url

$request->validate([
    'URL' => 'url',
]);

単純にURL形式で記述されているかをチェックしてくれます。

実際に有効なURLかどうか:active_url

$request->validate([
    'URL' => 'active_url',
]);

PHPのdns_get_record関数を内部的に実行し有効になっているURLかをチェックしてくれます。

公式:dns_get_record関数

Eメールアドレス形式かどうか:email

$request->validate([
    'email' => 'email',
]);

ファイル形式かどうか:file

$request->validate([
    'file' => 'file',
]);

IPアドレスかどうか:ip

$request->validate([
    'address' => 'ip',
]);

JSON形式かどうか:json

$request->validate([
    'data' => 'json',
]);

画像ファイルかどうか:image

$request->validate([
    'file' => 'image',
]);

拡張子がjpg、jpeg、png、bmp、gif、svg、webp

日付に関するルール

日時形式(タイムスタンプに変換可能)かどうか:date

$request->validate([
    'now' => 'date',
]);

指定日と一致するかどうか:date_equals : 日付

$request->validate([
    'now' => 'date_equals:2022/3/30',
]);

日付フォーマットが一致するかどうか:date_format : フォーマット

$request->validate([
    'now' => 'date_format:Y-m-d H:i:s',
]);

フォーマットはphpのDateTimeクラスが定義しているものを使用できます。しかしフォーマット指定と入力値との一致は結構厳格なので注意してください。

例えばY-m-d H:i:s形式を指定した場合2022-03-30 23:59:59はOKですが2022-3-30 23:59:59(月がn形式)2022-03-30(時間がない)はNGになります。

フォーマットは以下の記事にまとめてあります。DateTimeクラスの使い方と一緒に見てみてください。

指定日より後かどうか:after : 日付

$request->validate([
    'now' => 'after:2022/3/30',
]);

指定日と一致もしくは後かどうか:after_or_equal : 日付

$request->validate([
    'now' => 'after_or_equal:2022/3/30',
]);

指定日より前かどうか:before : 日付

$request->validate([
    'now' => 'before:2022/3/30',
]);

指定日と一致もしくは前かどうか:before_or_equal : 日付

$request->validate([
    'now' => 'before_or_equal:2022/3/30',
]);

データ型に関するルール

配列かどうか:array

$request->validate([
    'data' => 'array',
]);

真偽値かどうか:boolean

$request->validate([
    'judge' => 'boolean',
]);

null値を許容しているかどうか:nullable

$request->validate([
    'judge' => 'nullable',
]);

値が存在するかどうか:required

$request->validate([
    'id' => 'required',
]);

これが一番良く使うルールだと思います。要するに入力必須項目にすることができます。

項目が存在するかどうか:present

$request->validate([
    'id' => 'present',
]);

項目同士を比較するルール

指定した項目の値と同じかどうか:same : 項目名

$request->validate([
    'password' => 'same:confirm',
]);

指定した項目の値と違うかどうか:different : 項目名

$request->validate([
    'tel1' => 'different:tel2',
]);

指定した項目と比較:gt/gte/lt/lte : 項目名

$request->validate([
    'score1' => 'gt:average',   // score1 > average
    'score2' => 'gte:average',  // score2 >= average
    'score3' => 'lt:average',   // score3 < average
    'score4' => 'lte:average',  // score4 <= average
]);

その他のルール

チェック済みかどうか:accepted

$request->validate([
    'radio' => 'accepted', 
]);

input要素をtype="checkbox"またはtype="radio"にした時にチェックされているかを検証します。その他にも値がyeson1trueのいずれかでもOKになります。

バリデーションエラーで後続を中断:bail

$request->validate([
    'name' => 'bail|required|string|size:5|starts_with:Hello!', 
]);

複数のバリデーションルールを設けている際にbailを入れておくと1つでもエラーが起きたら後続の検証を中断させることができます。

正規表現で検証する:regex : パターン

$request->validate([
    'password' => 'regex:/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z\-]{8,24}$/', 
]);

正規表現のパターンに一致するかを検証してくれます。内部的にphpのpreg_match関数を実行しています。

データベースに存在するかどうか:exists : テーブル名,(カラムえ 名)

$request->validate([
    'name' => 'exists:users', 
]);

データベース内のname属性と同名のカラム内に入力値が存在するかをチェックしてくれます。name属性自体をカラム名にしないといけないので注意してください。

$request->validate([
    'DBのカラム名' => 'exists:テーブル名', 
]);

existsの第二引数に明示的にカラム名を渡せば項目名は自由に設定できるようになります。

$request->validate([
    '項目名' => 'exists:テーブル名,DBのカラム名', 
]);

またこのルールを使うのにuse文でDBファサードの読み込みなどは不要です。

use Illuminate\Support\Facades\DB;

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index