【まとめ】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属性')
ポイント
- ルールはvalidateメソッドの引数に渡す
- 引数は項目名とルールの連続配列
- ルールを複数列挙する時は「 | 」で区切る
- 左側から順番に検証される
- エラーメッセージは$errorsに格納
- ルール違反があれば自動リダイレクト
ルールはさまざまなものが予め用意されています。
数値に関するルール
整数値かどうか: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かをチェックしてくれます。
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"
にした時にチェックされているかを検証します。その他にも値がyes
、on
、1
、true
のいずれかでも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;
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。