本文へ移動
Laravel Tips

バリデーションのルール一覧

Laravel のバリデーションで使えるルールを分類ごとの表にまとめ、使い方が込み入ったルールには例を付けた一覧です。

バリデーション(送られてきた入力が正しいかのチェック)で使えるルールを、まとめた一覧です。たとえば「必ず入れる」(required)、「メールアドレスの形」(email)、「255 文字まで」(max:255)のように、1つ1つが小さな決まりになっています。

ルールの使い方の流れは、バリデーションのページにあります。ここでは、使えるルールを、分類ごとの表で全部並べ、あとに、使い方が込み入ったルールの例を付けます。

ルールの書き方#

ルールには、3つの書き方があります。

  • 文字で書く:'required' や 'max:255' のように、名前を書き、必要なら : のあとに引数を書く。引数が複数あるときは、, で区切る
  • 配列で書く:文字のルールを、配列に並べる。['required', 'unique:posts', 'max:255'] のようになる
  • Rule クラスで書く:Rule::in([...]) のように、メソッドで作る。条件が込み入ったときに便利

文字のルールを、| でつなげて1つの文字にして書くこともできます。

php
$request->validate([
    // 配列で書く
    'title' => ['required', 'unique:posts', 'max:255'],

    // | でつなげて、1つの文字で書く
    'body' => 'required|max:5000',

    // Rule クラスで書く
    'status' => ['required', Rule::in(['draft', 'published'])],
]);

ルールは、書いた順に確かめられます。

分類ごとの一覧#

次の表では、1つのルールが、いくつかの分類に出ることがあります(max など)。表の「名前」の引数は、あとの「くわしい使い方」にあります。

真偽(Booleans)#

名前 説明
accepted "yes"・"on"・1・"1"・true・"true" のどれか。利用規約の同意などに使う
accepted_if ほかの項目が決めた値のとき、accepted と同じ値であること
boolean 真偽の値にできること(true・false・1・0・"1"・"0")
declined "no"・"off"・0・"0"・false・"false" のどれか
declined_if ほかの項目が決めた値のとき、declined と同じ値であること

文字(Strings)#

名前 説明
active_url DNS(ドメインの名前を調べるしくみ)で、本物のドメインとして見つかる URL
alpha 文字(Unicode の文字)だけでできている
alpha_dash 文字・数字と、半角の - と _ だけでできている
alpha_num 文字と数字だけでできている
ascii 7ビットの ASCII 文字(半角の英数字や記号)だけでできている
confirmed ○○_confirmation という項目が同じ値で送られている
current_password ログイン中の人のパスワードと同じ
different 指定した項目と、ちがう値
doesnt_start_with 指定した値のどれでも始まらない
doesnt_end_with 指定した値のどれでも終わらない
email メールアドレスの形
ends_with 指定した値のどれかで終わる
enum 列挙型(決まった値の集まり)の正しい値
hex_color 16進数の色の値(#ff0000 のような形)
in 指定した値の一覧の中にある
ip IP アドレス
ipv4 IPv4 のアドレス
ipv6 IPv6 のアドレス
json 正しい JSON の文字
lowercase 小文字
mac_address MAC アドレス
max 最大の値(文字なら文字数)以下
min 最小の値(文字なら文字数)以上
not_in 指定した値の一覧の中にない
regex 正規表現(文字の並びのパターン)に合う
not_regex 正規表現に合わない
same 指定した項目と、同じ値
size 指定した大きさ(文字なら文字数)と同じ
starts_with 指定した値のどれかで始まる
string 文字
uppercase 大文字
url 正しい URL
ulid 正しい ULID(並べかえやすい、重ならない ID)
uuid 正しい UUID(重ならない ID)

数(Numbers)#

名前 説明
between 最小と最大のあいだ(両端を含む)
decimal 数で、指定した小数の桁数をもつ
different 指定した項目と、ちがう値
digits 整数で、指定した桁数ちょうど
digits_between 整数で、桁数が最小と最大のあいだ
gt 指定した項目(または値)より大きい
gte 指定した項目(または値)以上
integer 整数
lt 指定した項目(または値)より小さい
lte 指定した項目(または値)以下
max 最大の値以下
max_digits 整数で、桁数が最大の値以下
min 最小の値以上
min_digits 整数で、桁数が最小の値以上
multiple_of 指定した値の倍数
numeric 数
same 指定した項目と、同じ値
size 指定した値と、同じ値

配列(Arrays)#

名前 説明
array PHP の配列(キーの一覧を渡すと、そのキーだけを許す)
array_keys 配列で、キーが全部、指定した一覧の中にある
between 要素の数が、最小と最大のあいだ
contains 配列で、指定した値を全部含む
doesnt_contain 配列で、指定した値を1つも含まない
distinct 配列の中に、重なる値がない
in_array 指定した項目の値の中に、この値がある
in_array_keys 配列で、指定した値のどれかをキーに持つ
list キーが 0 から順に続く、リストの形の配列
max 要素の数が、最大の値以下
min 要素の数が、最小の値以上
size 要素の数が、指定した値と同じ

日付(Dates)#

名前 説明
after 指定した日付より後
after_or_equal 指定した日付と同じか、それより後
before 指定した日付より前
before_or_equal 指定した日付と同じか、それより前
date 正しい日付(「明日」のような相対の言い方は不可)
date_equals 指定した日付と同じ
date_format 指定した形式の日付
different 指定した項目と、ちがう値
timezone 正しいタイムゾーン(時間帯)の名前

ファイル(Files)#

名前 説明
between ファイルの大きさ(KB)が、最小と最大のあいだ
dimensions 画像で、幅や高さなどの決まりを満たす
encoding 指定した文字コードで書かれている
extensions ユーザーが付けた拡張子が、指定した一覧の中にある
file きちんとアップロードされたファイル
image 画像ファイル
max ファイルの大きさ(KB)が、最大の値以下
min ファイルの大きさ(KB)が、最小の値以上
mimetypes ファイルの種類(MIME タイプ)が、指定した一覧の中にある
mimes 拡張子の一覧に対応する、ファイルの種類である
size ファイルの大きさ(KB)が、指定した値と同じ

データベース(Database)#

名前 説明
exists 指定したデータベースの表に、その値がある
unique 指定したデータベースの表に、その値がない

そのほか(Utilities)#

名前 説明
anyOf 用意したルールの組のどれか1つを満たす(Rule::anyOf)
bail その項目で最初に失敗したら、残りのルールを確かめない
exclude 確かめたあとのデータ(validated の結果)に、この項目を入れない
exclude_if ほかの項目が決めた値のとき、確かめたあとのデータに入れない
exclude_unless ほかの項目が決めた値でないとき、確かめたあとのデータに入れない
exclude_with ほかの項目があるとき、確かめたあとのデータに入れない
exclude_without ほかの項目がないとき、確かめたあとのデータに入れない
filled あるときは、空ではない
missing 送られてきたデータの中にない
missing_if ほかの項目が決めた値のとき、データの中にない
missing_unless ほかの項目が決めた値でないとき、データの中にない
missing_with ほかの項目のどれかがあるとき、データの中にない
missing_with_all ほかの項目が全部あるとき、データの中にない
nullable null でもよい
present 送られてきたデータの中にある(空でもよい)
present_if ほかの項目が決めた値のとき、データの中にある
present_unless ほかの項目が決めた値でないとき、データの中にある
present_with ほかの項目のどれかがあるとき、データの中にある
present_with_all ほかの項目が全部あるとき、データの中にある
prohibited ない、または空
prohibited_if ほかの項目が決めた値のとき、ない、または空
prohibited_if_accepted ほかの項目が「同意」の値のとき、ない、または空
prohibited_if_declined ほかの項目が「拒否」の値のとき、ない、または空
prohibited_unless ほかの項目が決めた値でないとき、ない、または空
prohibits この項目があるとき、指定したほかの項目は、ない、または空
required あって、空ではない
required_if ほかの項目が決めた値のとき、あって、空ではない
required_if_accepted ほかの項目が「同意」の値のとき、あって、空ではない
required_if_declined ほかの項目が「拒否」の値のとき、あって、空ではない
required_unless ほかの項目が決めた値でないとき、あって、空ではない
required_with ほかの項目のどれかが、あって空でないとき、あって、空ではない
required_with_all ほかの項目が全部、あって空でないとき、あって、空ではない
required_without ほかの項目のどれかが、ないか空のとき、あって、空ではない
required_without_all ほかの項目が全部、ないか空のとき、あって、空ではない
required_array_keys 配列で、指定したキーを少なくとも含む
sometimes 送られてきたデータの中にあるときだけ、確かめる

sometimes の使い方は、バリデーションのページの「条件で、ルールを足す」にあります。

くわしい使い方#

引数のあるルールや、使い方が込み入ったルールを、名前順に説明します。

accepted#

"yes"・"on"・1・"1"・true・"true" のどれかであること。利用規約の同意のチェックなどに使えます。

accepted_if#

accepted_if:anotherfield,value,... の形です。ほかの項目が、決めた値のとき、accepted と同じ値であること。

active_url#

dns_get_record という PHP の関数で、有効な A レコードか AAAA レコード(ドメインから、サーバーの場所を調べる記録)が見つかること。URL のホスト名は、parse_url で取り出してから調べます。

DNS を調べるルール(active_url や email:dns)をテストするときは、Validator::fakeDnsLookups で DNS の問い合わせをにせものにできます。ほかの確かめは、そのまま動きます。

php
use Illuminate\Support\Facades\Validator;

Validator::fakeDnsLookups();

after#

after:date の形です。指定した日付より後であること。書いた日付は、strtotime という PHP の関数で日付に直してから比べます。

php
'start_date' => ['required', 'date', 'after:tomorrow']

日付の代わりに、比べたい別の項目の名前を書けます。

php
'finish_date' => ['required', 'date', 'after:start_date']

date ルールを作る道具(Rule::date())で、メソッドをつなげて書くこともできます。

php
use Illuminate\Validation\Rule;

'start_date' => [
    'required',
    Rule::date()->after(today()->addDays(7)),
],

afterToday(今日より後)と todayOrAfter(今日か、それより後)も使えます。

php
'start_date' => [
    'required',
    Rule::date()->afterToday(),
],

after_or_equal#

after_or_equal:date の形です。指定した日付と同じか、それより後であること。くわしくは after と同じです。

php
use Illuminate\Validation\Rule;

'start_date' => [
    'required',
    Rule::date()->afterOrEqual(today()->addDays(7)),
],

anyOf#

Rule::anyOf は、用意したルールの組のうち、どれか1つを満たせばよい、というルールです。次の例では、username が、メールアドレスか、6 文字以上の英数字(- を含む)のどちらかなら通ります。

php
use Illuminate\Validation\Rule;

'username' => [
    'required',
    Rule::anyOf([
        ['string', 'email'],
        ['string', 'alpha_dash', 'min:6'],
    ]),
],

alpha・alpha_dash・alpha_num#

alpha は、Unicode の文字(\p{L} と \p{M})だけでできていること。alpha_dash は、文字と数字(\p{N} も)に加え、半角の - と _。alpha_num は、文字と数字だけです。

ascii オプションを付けると、半角の英数字(alpha は a-z と A-Z、ほかは 0-9 も)だけに限れます。

php
'username' => ['alpha:ascii'],
'username' => ['alpha_dash:ascii'],
'username' => ['alpha_num:ascii'],

array#

PHP の配列であること。

ルールに値を渡すと、配列のキーが、その一覧の中のものだけに限られます。次の例では、admin キーが、一覧にないので、失敗します。

php
use Illuminate\Support\Facades\Validator;

$input = [
    'user' => [
        'name' => 'Taylor Otwell',
        'username' => 'taylorotwell',
        'admin' => true,
    ],
];

Validator::make($input, [
    'user' => ['array:name,username'],
]);

ふつうは、配列に入ってよいキーを、いつも書いておくほうがよいです。

array_keys#

array_keys:foo,bar,... の形です。配列で、すべてのキーが、指定した一覧の中にあること。キーは、少なくとも1つ要ります。

php
'user' => ['array_keys:name,username'],

Rule::arrayKeys でも書けます。

php
'user' => [Rule::arrayKeys('name', 'username')],

bail#

その項目で、最初に失敗したら、残りのルールを確かめません。

bail は、その項目だけを止めます。1つでも失敗したら、全部の項目を止めたいときは、バリデーターの stopOnFirstFailure メソッドを使います。

php
if ($validator->stopOnFirstFailure()->fails()) {
    // ...
}

before#

before:date の形です。指定した日付より前であること。日付は strtotime で日付に直して比べます。after と同じに、別の項目の名前も書けます。

php
use Illuminate\Validation\Rule;

'start_date' => [
    'required',
    Rule::date()->before(today()->subDays(7)),
],

beforeToday(今日より前)と todayOrBefore(今日か、それより前)も使えます。

php
'start_date' => [
    'required',
    Rule::date()->beforeToday(),
],

before_or_equal#

before_or_equal:date の形です。指定した日付と同じか、それより前であること。before と同じです。

php
use Illuminate\Validation\Rule;

'start_date' => [
    'required',
    Rule::date()->beforeOrEqual(today()->subDays(7)),
],

between#

between:min,max の形です。大きさが、最小と最大のあいだ(両端を含む)にあること。文字・数・配列・ファイルは、size ルールと同じ決まりで数えます。

boolean#

真偽の値にできること。使える入力は、true・false・1・0・"1"・"0" です。

strict を付けると、値が true か false のときだけ、正しいことにできます。

php
'foo' => ['boolean:strict']

confirmed#

○○_confirmation という項目が、同じ値で送られていること。たとえば、確かめる項目が password なら、password_confirmation が必要です。

確認の項目の名前を決めることもできます。confirmed:repeat_username なら、repeat_username が同じ値であることを確かめます。

contains・doesnt_contain#

contains:foo,bar,... は、配列が、指定した値を全部含むこと。doesnt_contain:foo,bar,... は、配列が、指定した値を1つも含まないこと。値を implode で1つの文字につながなくて済むように、Rule::contains と Rule::doesntContain も用意されています。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'roles' => [
        'required',
        'array',
        Rule::contains(['admin', 'editor']),
    ],
]);
php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'roles' => [
        'required',
        'array',
        Rule::doesntContain(['admin', 'editor']),
    ],
]);

current_password#

ログインしている人のパスワードと、同じであること。1つ目の引数で、認証のガード(ログインの確かめ方の種類)を決められます。

php
'password' => ['current_password:api']

date・date_equals・date_format#

date は、strtotime が読める正しい日付で、「明日」のような相対の言い方ではないこと。date_equals:date は、指定した日付と同じであること。

date_format:format,... は、指定した形式のどれかに合うこと。PHP の DateTime クラスが使える形式は、全部使えます。1つの項目に、date と date_format の両方は使わず、どちらか一方にします。Rule::date() を使って書くこともできます。

php
use Illuminate\Validation\Rule;

'start_date' => [
    'required',
    Rule::date()->format('Y-m-d'),
],

decimal#

decimal:min,max の形です。数で、指定した桁数の小数をもつこと。

php
// Must have exactly two decimal places (9.99)...
'price' => ['decimal:2']

// Must have between 2 and 4 decimal places...
'price' => ['decimal:2,4']

declined・declined_if#

declined は、"no"・"off"・0・"0"・false・"false" のどれかであること。declined_if:anotherfield,value,... は、ほかの項目が決めた値のとき、declined と同じ値であること。

different・same#

different:field は、指定した項目と、ちがう値であること。same:field は、指定した項目と、同じ値であること。

digits・digits_between・max_digits・min_digits#

digits:value は、整数で、桁数がちょうど指定した値であること。digits_between:min,max は、桁数が最小と最大のあいだ。max_digits:value は桁数が最大の値以下、min_digits:value は最小の値以上です。

dimensions#

画像で、引数で決めた、大きさの決まりを満たすこと。

php
'avatar' => ['dimensions:min_width=100,min_height=200']

使える決まりは、min_width・max_width・min_height・max_height・width・height・ratio・min_ratio・max_ratio です。

決まり 説明
min_width / max_width 幅の最小/最大
min_height / max_height 高さの最小/最大
width / height 幅/高さが、ちょうどその値
ratio 縦横の比(幅 ÷ 高さ)
min_ratio / max_ratio 縦横の比の最小/最大

ratio は、幅 ÷ 高さで表します。3/2 のような分数でも、1.5 のような小数でも書けます。

php
'avatar' => ['dimensions:ratio=3/2']

min_ratio と max_ratio で、よいとする比の範囲を決められます。

php
'avatar' => ['dimensions:min_ratio=1/2,max_ratio=3/2']

引数が多いので、Rule::dimensions でメソッドをつなげて書くほうが、便利なことが多いです。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'avatar' => [
        'required',
        Rule::dimensions()
            ->maxWidth(1000)
            ->maxHeight(500)
            ->ratio(3 / 2),
    ],
]);

minRatio・maxRatio・ratioBetween で、比の決まりも書けます。

php
Rule::dimensions()->ratioBetween(min: 1 / 2, max: 3 / 2);

distinct#

配列を確かめるとき、重なる値がないこと。

php
'foo.*.id' => ['distinct']

はじめは、ゆるい比べ方(型が違っても、同じ値と見る)です。きびしい比べ方にしたいときは、strict を付けます。

php
'foo.*.id' => ['distinct:strict']

大文字と小文字の違いを、無視したいときは、ignore_case を付けます。

php
'foo.*.id' => ['distinct:ignore_case']

doesnt_start_with・doesnt_end_with・starts_with・ends_with#

doesnt_start_with:foo,bar,... は、指定した値のどれでも始まらないこと。doesnt_end_with:foo,bar,... は、どれでも終わらないこと。starts_with:foo,bar,... は、どれかで始まること。ends_with:foo,bar,... は、どれかで終わることです。

email#

メールアドレスの形であること。確かめには、egulias/email-validator というパッケージを使います。はじめは RFCValidation を使いますが、ほかの方法も選べます。

php
'email' => ['email:rfc,dns']

この例は、RFCValidation と DNSCheckValidation の両方を使います。選べる方法は、次のとおりです。

名前 説明
rfc RFC(インターネットの決まり)に合う形か確かめる(RFCValidation)
strict RFC に合い、さらに警告もない(末尾のピリオドや連続するピリオドを認めない。NoRFCWarningsValidation)
dns ドメインに、正しい MX レコード(メールの届け先の記録)がある(DNSCheckValidation)
spoof 見た目が似た文字で、だますような Unicode の文字を含まない(SpoofCheckValidation)
filter PHP の filter_var 関数で正しい(FilterEmailValidation)
filter_unicode filter_var で正しい。一部の Unicode の文字を認める(FilterEmailValidation::unicode())

メソッドをつなげて書く道具もあります。

php
use Illuminate\Validation\Rule;

$request->validate([
    'email' => [
        'required',
        Rule::email()
            ->rfcCompliant(strict: false)
            ->validateMxRecord()
            ->preventSpoofing()
    ],
]);

dns は、本当に DNS を調べて、ドメインに正しい MX レコードがあるかを確かめます。そのメールボックスが本当にあるかまでは、分かりません。

テストでは、本物の DNS の問い合わせに頼らないほうがよいので、Validator::fakeDnsLookups で DNS の問い合わせをにせものにできます。rfc など、ほかの確かめは動きます。

php
use Illuminate\Support\Facades\Validator;

Validator::fakeDnsLookups();

こうすると、アプリで使っているルールを、そのままテストでも使えます。

php
'email' => ['required', 'email:rfc,dns'],

注意

dns と spoof には、PHP の intl 拡張(国際化のための部品)が要ります。

encoding#

encoding:encoding_type の形です。指定した文字コードで書かれていること。ファイルや文字の値の文字コードを、PHP の mb_check_encoding 関数で確かめます。ファイル用のルールを作る道具でも書けます。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\File;

Validator::validate($input, [
    'attachment' => [
        'required',
        File::types(['csv'])
            ->encoding('utf-8'),
    ],
]);

enum#

Enum ルールは、値が、列挙型(決まった値の集まり)の正しい値かを確かめます。引数は、列挙型の名前だけです。文字や数の値を確かめるときは、それぞれの値に文字か数が付いた列挙型(backed enum)を渡します。

php
use App\Enums\ServerStatus;
use Illuminate\Validation\Rule;

$request->validate([
    'status' => [Rule::enum(ServerStatus::class)],
]);

only と except で、正しいとする値を、しぼれます。

php
Rule::enum(ServerStatus::class)
    ->only([ServerStatus::Pending, ServerStatus::Active]);

Rule::enum(ServerStatus::class)
    ->except([ServerStatus::Pending, ServerStatus::Active]);

when で、条件によってルールを変えられます。

php
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;

Rule::enum(ServerStatus::class)
    ->when(
        Auth::user()->isAdmin(),
        fn ($rule) => $rule->only(...),
        fn ($rule) => $rule->only(...),
    );

exclude・exclude_if・exclude_unless・exclude_with・exclude_without#

確かめたあとのデータ(validate と validated が返すデータ)から、その項目を外すルールです。

  • exclude:いつも外す
  • exclude_if:anotherfield,value:ほかの項目が、その値のとき外す
  • exclude_unless:anotherfield,value:ほかの項目が、その値でないとき外す。値に null を書いたとき(exclude_unless:name,null)は、比べる項目が null か送られていないときだけ残し、それ以外は外す
  • exclude_with:anotherfield:ほかの項目があるとき外す
  • exclude_without:anotherfield:ほかの項目がないとき外す

込み入った条件は、Rule::excludeIf と Rule::excludeUnless で書けます。真偽の値か、true か false を返す関数を渡します。excludeIf は true で外し、excludeUnless は true で外しません。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($request->all(), [
    'role_id' => [Rule::excludeIf($request->user()->is_admin)],
]);

Validator::make($request->all(), [
    'role_id' => [Rule::excludeIf(fn () => $request->user()->is_admin)],
]);
php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($request->all(), [
    'role_id' => [Rule::excludeUnless($request->user()->is_admin)],
]);

Validator::make($request->all(), [
    'role_id' => [Rule::excludeUnless(fn () => $request->user()->is_admin)],
]);

exists#

exists:table,column の形です。データベースの表に、その値があること。

列の名前を書かないと、項目の名前が使われます。次の例は、states の表の state 列に、送られた state と同じ値の行があるかを確かめます。

php
'state' => ['exists:states']

列の名前は、表の名前のあとに書けます。

php
'state' => ['exists:states,abbreviation']

接続(どのデータベースにつなぐか)を決めたいときは、表の名前の前に、接続の名前を付けます。

php
'email' => ['exists:connection.staff,email']

表の名前の代わりに、Eloquent のモデル(データベースの表を、PHP から扱いやすくしたクラス)を書くと、その表が使われます。

php
'user_id' => ['exists:App\Models\User,id']

問い合わせを細かく決めたいときは、Rule クラスで書きます。

php
use Illuminate\Database\Query\Builder;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::exists('staff')->where(function (Builder $query) {
            $query->where('account_id', 1);
        }),
    ],
]);

Rule::exists でも、列の名前は、2つ目の引数に書けます。

php
'state' => [Rule::exists('states', 'abbreviation')],

値の配列が、全部データベースにあるかを確かめたいときは、exists と array を、いっしょに付けます。

php
'states' => ['array', Rule::exists('states', 'abbreviation')],

2つを付けると、Laravel は、問い合わせを1つにまとめて、全部の値があるかを調べます。

extensions#

extensions:foo,bar,... の形です。ユーザーが付けた拡張子(ファイル名の最後の部分)が、一覧のどれかであること。

php
'photo' => ['required', 'extensions:jpg,png'],

注意

ユーザーが付けた拡張子だけで、ファイルを確かめてはいけません。ふつうは、mimes か mimetypes と、いっしょに使います。

file・filled#

file は、きちんとアップロードされたファイルであること。filled は、項目があるときは、空でないことです。

gt・gte・lt・lte#

指定した項目(または値)と比べます。比べる2つは、同じ型である必要があります。文字・数・配列・ファイルは、size ルールと同じ決まりで比べます。

ルール 説明
gt:field 指定した項目より大きい
gte:field 指定した項目以上
lt:field 指定した項目より小さい
lte:field 指定した項目以下

hex_color#

16進数の色の値であること。

image#

画像(jpg・jpeg・png・bmp・gif・webp・avif・heic・heif)であること。

注意

image ルールは、はじめは SVG ファイルを認めません。XSS(ほかの人が悪意のあるスクリプトを、ページに混ぜこむ攻撃)の危険があるからです。認めたいときは、allow_svg を付けます(image:allow_svg)。

in・not_in#

in:foo,bar,... は、値が、指定した一覧の中にあること。not_in:foo,bar,... は、一覧の中にないことです。値を implode で1つの文字につながなくて済むように、Rule::in と Rule::notIn も用意されています。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'zones' => [
        'required',
        'array',
        Rule::in(['first-zone', 'second-zone']),
    ],
]);
php
use Illuminate\Validation\Rule;

Validator::make($data, [
    'toppings' => [
        'required',
        Rule::notIn(['sprinkles', 'cherries']),
    ],
]);

in を array と組み合わせると、入力の配列の値が全部、一覧の中にある必要があります。次の例では、LAS が一覧にないので、失敗します。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

$input = [
    'airports' => ['NYC', 'LAS'],
];

Validator::make($input, [
    'airports' => [
        'required',
        'array',
    ],
    'airports.*' => Rule::in(['NYC', 'LIT']),
]);

in_array・in_array_keys#

in_array:anotherfield.* は、値が、指定した項目の値の中にあること。in_array_keys:value.* は、配列で、指定した値のどれかを、キーに持つことです。

php
'config' => ['array', 'in_array_keys:timezone']

integer#

整数であること。

strict を付けると、型が整数のときだけ正しいことにできます。"5" のような、数字を書いた文字は、正しくないことになります。

php
'age' => ['integer:strict']

注意

このルールは、入力が「整数」という型であるかは確かめません。PHP の FILTER_VALIDATE_INT が認める型であるかだけを確かめます。数であることを確かめたいときは、numeric といっしょに使います。

ip・ipv4・ipv6・mac_address・json#

ip は IP アドレス、ipv4 は IPv4 のアドレス、ipv6 は IPv6 のアドレス、mac_address は MAC アドレス、json は正しい JSON の文字であることです。

list・lowercase・uppercase#

list は、配列で、キーが 0 から count($array) - 1 まで順に続く、リストの形であること。lowercase は小文字、uppercase は大文字であることです。

max・min・size#

max:value は、最大の値以下。min:value は、最小の値以上。size:value は、指定した値と同じ大きさ。大きさは、型によって、次のように数えます。

型 数え方
文字 文字数
数 その整数の値(numeric か integer のルールも必要)
配列 要素の数(count)
ファイル ファイルの大きさ(KB)
php
// Validate that a string is exactly 12 characters long...
'title' => ['size:12'];

// Validate that a provided integer equals 10...
'seats' => ['integer', 'size:10'];

// Validate that an array has exactly 5 elements...
'tags' => ['array', 'size:5'];

// Validate that an uploaded file is exactly 512 kilobytes...
'image' => ['file', 'size:512'];

mimetypes・mimes#

mimetypes:text/plain,... は、ファイルの種類(MIME タイプ)が、指定した一覧のどれかであること。

php
'video' => ['mimetypes:video/avi,video/mpeg,video/quicktime'],

'media' => ['mimetypes:image/*,video/*'],

ファイルの中身を読んで、種類を推しはかります。ユーザーの側が伝えてきた種類とは、ちがうことがあります。

mimes:foo,bar,... は、拡張子の一覧に対応する種類であること。

php
'photo' => ['mimes:jpg,bmp,png']

拡張子だけを書きますが、実際は、ファイルの中身を読んで種類を推しはかります。種類と拡張子の一覧は、次の場所にあります。

https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types

種類と拡張子の食いちがい#

mimes は、ファイルの種類と、ユーザーが付けた拡張子が、合っているかは確かめません。たとえば、mimes:png は、中身が正しい PNG なら、photo.txt という名前でも、正しい PNG の画像として扱います。ユーザーが付けた拡張子も確かめたいときは、extensions ルールを使います。

multiple_of#

multiple_of:value の形です。指定した値の倍数であること。

missing・missing_if・missing_unless・missing_with・missing_with_all#

送られてきたデータの中に、ないことを求めるルールです。

  • missing:いつも、ない
  • missing_if:anotherfield,value,...:ほかの項目が、どれかの値のとき、ない
  • missing_unless:anotherfield,value:ほかの項目が、その値でないとき、ない
  • missing_with:foo,bar,...:ほかの項目のどれかがあるときだけ、ない
  • missing_with_all:foo,bar,...:ほかの項目が全部あるときだけ、ない

not_regex・regex#

regex:pattern は、正規表現に合うこと。not_regex:pattern は、合わないことです。

中では、PHP の preg_match 関数を使うので、パターンは preg_match の書き方(区切りの文字も含む)にします。たとえば、'email' => ['regex:/^.+@.+$/i'] や 'email' => ['not_regex:/^.+$/i'] です。

nullable#

null でもよいこと。

numeric#

数であること。

strict を付けると、整数か小数の型のときだけ、正しいことにできます。数字を書いた文字("5" など)は、正しくないことになります。

php
'amount' => ['numeric:strict']

present・present_if・present_unless・present_with・present_with_all#

送られてきたデータの中に、あることを求めるルールです(空でもよい)。

  • present:いつも、ある
  • present_if:anotherfield,value,...:ほかの項目が、どれかの値のとき、ある
  • present_unless:anotherfield,value:ほかの項目が、その値でないとき、ある
  • present_with:foo,bar,...:ほかの項目のどれかがあるときだけ、ある
  • present_with_all:foo,bar,...:ほかの項目が全部あるときだけ、ある

prohibited・prohibited_if・prohibited_unless・prohibits#

「ない、または空」を求めるルールです。「空」とは、次のどれかのことです。

  • 値が null
  • 値が空の文字
  • 値が空の配列か、空の Countable のオブジェクト
  • 値が、パスの空のアップロードファイル
ルール 説明
prohibited いつも、ない、または空
prohibited_if:anotherfield,value,... ほかの項目が、どれかの値のとき、ない、または空
prohibited_if_accepted:anotherfield,... ほかの項目が "yes"・"on"・1・"1"・true・"true" のとき
prohibited_if_declined:anotherfield,... ほかの項目が "no"・"off"・0・"0"・false・"false" のとき
prohibited_unless:anotherfield,value,... ほかの項目が、どれかの値でないとき、ない、または空
prohibits:anotherfield,... この項目があって空でないとき、指定したほかの項目は、全部、ない、または空

込み入った条件は、Rule::prohibitedIf と Rule::prohibitedUnless で書けます。真偽の値か、true か false を返す関数を渡します。prohibitedIf は true のとき禁止し、prohibitedUnless は true のとき禁止しません。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($request->all(), [
    'role_id' => [Rule::prohibitedIf($request->user()->is_admin)],
]);

Validator::make($request->all(), [
    'role_id' => [Rule::prohibitedIf(fn () => $request->user()->is_admin)],
]);
php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($request->all(), [
    'role_id' => [Rule::prohibitedUnless($request->user()->is_admin)],
]);

Validator::make($request->all(), [
    'role_id' => [Rule::prohibitedUnless(fn () => $request->user()->is_admin)],
]);

required と、その仲間#

required は、送られてきたデータの中にあって、空でないこと。「空」とは、次のどれかのことです。

  • 値が null
  • 値が空の文字
  • 値が空の配列か、空の Countable のオブジェクト
  • 値が、パスのないアップロードファイル

仲間のルールは、次のとおりです。

ルール 説明
required_if:anotherfield,value,... ほかの項目が、どれかの値のとき、あって、空でない
required_if_accepted:anotherfield,... ほかの項目が "yes"・"on"・1・"1"・true・"true" のとき
required_if_declined:anotherfield,... ほかの項目が "no"・"off"・0・"0"・false・"false" のとき
required_unless:anotherfield,value,... ほかの項目が、どれかの値でないとき、あって、空でない
required_with:foo,bar,... ほかの項目のどれかが、あって空でないときだけ
required_with_all:foo,bar,... ほかの項目が全部、あって空でないときだけ
required_without:foo,bar,... ほかの項目のどれかが、ないか空のときだけ
required_without_all:foo,bar,... ほかの項目が全部、ないか空のときだけ
required_array_keys:foo,bar,... 配列で、指定したキーを少なくとも含む

required_unless では、anotherfield の項目が、送られてきたデータの中にある必要があります(value が null のときを除く)。value に null を書いたとき(required_unless:name,null)は、比べる項目が null か送られていないときだけ必須でなくなり、それ以外は必須になります。

込み入った条件は、Rule::requiredIf と Rule::requiredUnless で書けます。真偽の値か、true か false を返す関数を渡します。requiredIf は true のとき必須にし、requiredUnless は true のとき必須にしません。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($request->all(), [
    'role_id' => [Rule::requiredIf($request->user()->is_admin)],
]);

Validator::make($request->all(), [
    'role_id' => [Rule::requiredIf(fn () => $request->user()->is_admin)],
]);
php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($request->all(), [
    'role_id' => [Rule::requiredUnless($request->user()->is_admin)],
]);

Validator::make($request->all(), [
    'role_id' => [Rule::requiredUnless(fn () => $request->user()->is_admin)],
]);

string#

文字であること。null も認めたいときは、nullable を付けます。

Rule::string() で、メソッドをつなげて書くこともできます。

php
use Illuminate\Validation\Rule;

'title' => [
    'required',
    Rule::string()
        ->min(3)
        ->max(255)
        ->alphaDash(ascii: true),
],

使えるメソッドは、alpha・alphaDash・alphaNumeric・ascii・between・doesntEndWith・doesntStartWith・endsWith・exactly・lowercase・max・min・startsWith・uppercase です。when と unless で、条件によって決まりを足すこともできます。

timezone#

DateTimeZone::listIdentifiers メソッドが認める、正しいタイムゾーンの名前であること。

そのメソッドが受け取る引数も、ルールに渡せます。

php
'timezone' => ['required', 'timezone:all'];

'timezone' => ['required', 'timezone:Africa'];

'timezone' => ['required', 'timezone:per_country,US'];

unique#

unique:table,column の形です。データベースの表に、その値がないこと。

表や列の名前を決める

表の名前の代わりに、Eloquent のモデルを書くと、その表が使われます。

php
'email' => ['unique:App\Models\User,email_address']

column で、対応する列を決められます。書かないと、項目の名前が使われます。

php
'email' => ['unique:users,email_address']

データベースの接続を決める

バリデーターが使う接続を決めたいときは、表の名前の前に、接続の名前を付けます。

php
'email' => ['unique:connection.users,email_address']

決めた ID を無視する

確かめるときに、ある ID を無視したいことがあります。たとえば、名前・メールアドレス・場所を直す「プロフィール変更」の画面です。メールアドレスは、重ならないことを確かめたいですが、名前だけを変えて、メールアドレスはそのままのとき、その人自身のアドレスなので、エラーにしたくありません。

そのユーザーの ID を無視させるには、Rule クラスで書きます。

php
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);

注意

ignore に、ユーザーが入力できるリクエストの値を、渡してはいけません。渡すのは、自動で増える ID や UUID のような、システムが作った、重ならない ID だけです。そうしないと、SQL インジェクション(データベースへの問い合わせを、悪意のある入力で書きかえる攻撃)を受けるおそれがあります。

ID の代わりに、モデルそのものを渡すこともできます。Laravel が、キーを取り出します。

php
Rule::unique('users')->ignore($user);

主キー(行を見分ける列)の名前が id ではないときは、ignore の2つ目の引数に、列の名前を書きます。

php
Rule::unique('users')->ignore($user->id, 'user_id');

はじめは、確かめる項目の名前と同じ名前の列で、重ならないかを確かめます。別の列の名前は、unique の2つ目の引数に書けます。

php
Rule::unique('users', 'email_address')->ignore($user->id);

条件を足す

where メソッドで、問い合わせの条件を足せます。次の例は、account_id 列の値が 1 の行だけを調べます。

php
'email' => Rule::unique('users')->where(fn (Builder $query) => $query->where('account_id', 1))

消した行を無視する

はじめは、unique は、ソフトデリート(消したことにして、実際は残す方法)された行も含めて、重ならないかを調べます。ソフトデリートされた行を外すには、withoutTrashed を呼びます。

php
Rule::unique('users')->withoutTrashed();

ソフトデリートの列の名前が deleted_at でないときは、withoutTrashed に列の名前を渡します。

php
Rule::unique('users')->withoutTrashed('was_deleted_at');

url#

正しい URL であること。

正しいとするプロトコル(URL の最初の部分)を、引数で決められます。

php
'url' => ['url:http,https'],

'game' => ['url:minecraft,steam'],

ulid・uuid#

ulid は、正しい ULID(Universally Unique Lexicographically Sortable Identifier)であること。

uuid は、正しい RFC 9562 の UUID(バージョン 1・3・4・5・6・7・8)であること。バージョンを決めることもできます。

php
'uuid' => ['uuid:4']

ファイルのルールを作る道具と、パスワードのルール#

File と Password の組み立て方は、バリデーションのページの「ファイルを確かめる」と「パスワードを確かめる」にあります。

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧