バリデーションのルール一覧
Laravel のバリデーションで使えるルールを分類ごとの表にまとめ、使い方が込み入ったルールには例を付けた一覧です。
バリデーション(送られてきた入力が正しいかのチェック)で使えるルールを、まとめた一覧です。たとえば「必ず入れる」(required)、「メールアドレスの形」(email)、「255 文字まで」(max:255)のように、1つ1つが小さな決まりになっています。
ルールの使い方の流れは、バリデーションのページにあります。ここでは、使えるルールを、分類ごとの表で全部並べ、あとに、使い方が込み入ったルールの例を付けます。
ルールの書き方#
ルールには、3つの書き方があります。
- 文字で書く:
'required'や'max:255'のように、名前を書き、必要なら:のあとに引数を書く。引数が複数あるときは、,で区切る - 配列で書く:文字のルールを、配列に並べる。
['required', 'unique:posts', 'max:255']のようになる Ruleクラスで書く:Rule::in([...])のように、メソッドで作る。条件が込み入ったときに便利
文字のルールを、| でつなげて1つの文字にして書くこともできます。
$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 の問い合わせをにせものにできます。ほかの確かめは、そのまま動きます。
use Illuminate\Support\Facades\Validator;
Validator::fakeDnsLookups();
after#
after:date の形です。指定した日付より後であること。書いた日付は、strtotime という PHP の関数で日付に直してから比べます。
'start_date' => ['required', 'date', 'after:tomorrow']
日付の代わりに、比べたい別の項目の名前を書けます。
'finish_date' => ['required', 'date', 'after:start_date']
date ルールを作る道具(Rule::date())で、メソッドをつなげて書くこともできます。
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->after(today()->addDays(7)),
],
afterToday(今日より後)と todayOrAfter(今日か、それより後)も使えます。
'start_date' => [
'required',
Rule::date()->afterToday(),
],
after_or_equal#
after_or_equal:date の形です。指定した日付と同じか、それより後であること。くわしくは after と同じです。
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->afterOrEqual(today()->addDays(7)),
],
anyOf#
Rule::anyOf は、用意したルールの組のうち、どれか1つを満たせばよい、というルールです。次の例では、username が、メールアドレスか、6 文字以上の英数字(- を含む)のどちらかなら通ります。
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 も)だけに限れます。
'username' => ['alpha:ascii'],
'username' => ['alpha_dash:ascii'],
'username' => ['alpha_num:ascii'],
array#
PHP の配列であること。
ルールに値を渡すと、配列のキーが、その一覧の中のものだけに限られます。次の例では、admin キーが、一覧にないので、失敗します。
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つ要ります。
'user' => ['array_keys:name,username'],
Rule::arrayKeys でも書けます。
'user' => [Rule::arrayKeys('name', 'username')],
bail#
その項目で、最初に失敗したら、残りのルールを確かめません。
bail は、その項目だけを止めます。1つでも失敗したら、全部の項目を止めたいときは、バリデーターの stopOnFirstFailure メソッドを使います。
if ($validator->stopOnFirstFailure()->fails()) {
// ...
}
before#
before:date の形です。指定した日付より前であること。日付は strtotime で日付に直して比べます。after と同じに、別の項目の名前も書けます。
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->before(today()->subDays(7)),
],
beforeToday(今日より前)と todayOrBefore(今日か、それより前)も使えます。
'start_date' => [
'required',
Rule::date()->beforeToday(),
],
before_or_equal#
before_or_equal:date の形です。指定した日付と同じか、それより前であること。before と同じです。
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 のときだけ、正しいことにできます。
'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 も用意されています。
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'roles' => [
'required',
'array',
Rule::contains(['admin', 'editor']),
],
]);
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'roles' => [
'required',
'array',
Rule::doesntContain(['admin', 'editor']),
],
]);
current_password#
ログインしている人のパスワードと、同じであること。1つ目の引数で、認証のガード(ログインの確かめ方の種類)を決められます。
'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() を使って書くこともできます。
use Illuminate\Validation\Rule;
'start_date' => [
'required',
Rule::date()->format('Y-m-d'),
],
decimal#
decimal:min,max の形です。数で、指定した桁数の小数をもつこと。
// 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#
画像で、引数で決めた、大きさの決まりを満たすこと。
'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 のような小数でも書けます。
'avatar' => ['dimensions:ratio=3/2']
min_ratio と max_ratio で、よいとする比の範囲を決められます。
'avatar' => ['dimensions:min_ratio=1/2,max_ratio=3/2']
引数が多いので、Rule::dimensions でメソッドをつなげて書くほうが、便利なことが多いです。
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 で、比の決まりも書けます。
Rule::dimensions()->ratioBetween(min: 1 / 2, max: 3 / 2);
distinct#
配列を確かめるとき、重なる値がないこと。
'foo.*.id' => ['distinct']
はじめは、ゆるい比べ方(型が違っても、同じ値と見る)です。きびしい比べ方にしたいときは、strict を付けます。
'foo.*.id' => ['distinct:strict']
大文字と小文字の違いを、無視したいときは、ignore_case を付けます。
'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 を使いますが、ほかの方法も選べます。
'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()) |
メソッドをつなげて書く道具もあります。
use Illuminate\Validation\Rule;
$request->validate([
'email' => [
'required',
Rule::email()
->rfcCompliant(strict: false)
->validateMxRecord()
->preventSpoofing()
],
]);
dns は、本当に DNS を調べて、ドメインに正しい MX レコードがあるかを確かめます。そのメールボックスが本当にあるかまでは、分かりません。
テストでは、本物の DNS の問い合わせに頼らないほうがよいので、Validator::fakeDnsLookups で DNS の問い合わせをにせものにできます。rfc など、ほかの確かめは動きます。
use Illuminate\Support\Facades\Validator;
Validator::fakeDnsLookups();
こうすると、アプリで使っているルールを、そのままテストでも使えます。
'email' => ['required', 'email:rfc,dns'],
注意
dns と spoof には、PHP の intl 拡張(国際化のための部品)が要ります。
encoding#
encoding:encoding_type の形です。指定した文字コードで書かれていること。ファイルや文字の値の文字コードを、PHP の mb_check_encoding 関数で確かめます。ファイル用のルールを作る道具でも書けます。
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)を渡します。
use App\Enums\ServerStatus;
use Illuminate\Validation\Rule;
$request->validate([
'status' => [Rule::enum(ServerStatus::class)],
]);
only と except で、正しいとする値を、しぼれます。
Rule::enum(ServerStatus::class)
->only([ServerStatus::Pending, ServerStatus::Active]);
Rule::enum(ServerStatus::class)
->except([ServerStatus::Pending, ServerStatus::Active]);
when で、条件によってルールを変えられます。
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 で外しません。
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)],
]);
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 と同じ値の行があるかを確かめます。
'state' => ['exists:states']
列の名前は、表の名前のあとに書けます。
'state' => ['exists:states,abbreviation']
接続(どのデータベースにつなぐか)を決めたいときは、表の名前の前に、接続の名前を付けます。
'email' => ['exists:connection.staff,email']
表の名前の代わりに、Eloquent のモデル(データベースの表を、PHP から扱いやすくしたクラス)を書くと、その表が使われます。
'user_id' => ['exists:App\Models\User,id']
問い合わせを細かく決めたいときは、Rule クラスで書きます。
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つ目の引数に書けます。
'state' => [Rule::exists('states', 'abbreviation')],
値の配列が、全部データベースにあるかを確かめたいときは、exists と array を、いっしょに付けます。
'states' => ['array', Rule::exists('states', 'abbreviation')],
2つを付けると、Laravel は、問い合わせを1つにまとめて、全部の値があるかを調べます。
extensions#
extensions:foo,bar,... の形です。ユーザーが付けた拡張子(ファイル名の最後の部分)が、一覧のどれかであること。
'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 も用意されています。
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
Validator::make($data, [
'zones' => [
'required',
'array',
Rule::in(['first-zone', 'second-zone']),
],
]);
use Illuminate\Validation\Rule;
Validator::make($data, [
'toppings' => [
'required',
Rule::notIn(['sprinkles', 'cherries']),
],
]);
in を array と組み合わせると、入力の配列の値が全部、一覧の中にある必要があります。次の例では、LAS が一覧にないので、失敗します。
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.* は、配列で、指定した値のどれかを、キーに持つことです。
'config' => ['array', 'in_array_keys:timezone']
integer#
整数であること。
strict を付けると、型が整数のときだけ正しいことにできます。"5" のような、数字を書いた文字は、正しくないことになります。
'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) |
// 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 タイプ)が、指定した一覧のどれかであること。
'video' => ['mimetypes:video/avi,video/mpeg,video/quicktime'],
'media' => ['mimetypes:image/*,video/*'],
ファイルの中身を読んで、種類を推しはかります。ユーザーの側が伝えてきた種類とは、ちがうことがあります。
mimes:foo,bar,... は、拡張子の一覧に対応する種類であること。
'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" など)は、正しくないことになります。
'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 のとき禁止しません。
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)],
]);
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 のとき必須にしません。
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)],
]);
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() で、メソッドをつなげて書くこともできます。
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 メソッドが認める、正しいタイムゾーンの名前であること。
そのメソッドが受け取る引数も、ルールに渡せます。
'timezone' => ['required', 'timezone:all'];
'timezone' => ['required', 'timezone:Africa'];
'timezone' => ['required', 'timezone:per_country,US'];
unique#
unique:table,column の形です。データベースの表に、その値がないこと。
表や列の名前を決める
表の名前の代わりに、Eloquent のモデルを書くと、その表が使われます。
'email' => ['unique:App\Models\User,email_address']
column で、対応する列を決められます。書かないと、項目の名前が使われます。
'email' => ['unique:users,email_address']
データベースの接続を決める
バリデーターが使う接続を決めたいときは、表の名前の前に、接続の名前を付けます。
'email' => ['unique:connection.users,email_address']
決めた ID を無視する
確かめるときに、ある ID を無視したいことがあります。たとえば、名前・メールアドレス・場所を直す「プロフィール変更」の画面です。メールアドレスは、重ならないことを確かめたいですが、名前だけを変えて、メールアドレスはそのままのとき、その人自身のアドレスなので、エラーにしたくありません。
そのユーザーの ID を無視させるには、Rule クラスで書きます。
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 が、キーを取り出します。
Rule::unique('users')->ignore($user);
主キー(行を見分ける列)の名前が id ではないときは、ignore の2つ目の引数に、列の名前を書きます。
Rule::unique('users')->ignore($user->id, 'user_id');
はじめは、確かめる項目の名前と同じ名前の列で、重ならないかを確かめます。別の列の名前は、unique の2つ目の引数に書けます。
Rule::unique('users', 'email_address')->ignore($user->id);
条件を足す
where メソッドで、問い合わせの条件を足せます。次の例は、account_id 列の値が 1 の行だけを調べます。
'email' => Rule::unique('users')->where(fn (Builder $query) => $query->where('account_id', 1))
消した行を無視する
はじめは、unique は、ソフトデリート(消したことにして、実際は残す方法)された行も含めて、重ならないかを調べます。ソフトデリートされた行を外すには、withoutTrashed を呼びます。
Rule::unique('users')->withoutTrashed();
ソフトデリートの列の名前が deleted_at でないときは、withoutTrashed に列の名前を渡します。
Rule::unique('users')->withoutTrashed('was_deleted_at');
url#
正しい URL であること。
正しいとするプロトコル(URL の最初の部分)を、引数で決められます。
'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)であること。バージョンを決めることもできます。
'uuid' => ['uuid:4']
ファイルのルールを作る道具と、パスワードのルール#
File と Password の組み立て方は、バリデーションのページの「ファイルを確かめる」と「パスワードを確かめる」にあります。
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。