カテゴリ: validation
掲載バージョン: Laravel 12・PHP 8.4
ルール名: accepted_if
関連: accepted, required_if, required_unless
変更履歴: Laravel 8.41 以降で追加
要点(TL;DR)
- 他フィールドが特定の値のときだけ「同意済み(accepted)」を要求する
accepted_if:other,valueの形式で指定する- チェックボックス未送信時はキー自体が存在しない点に注意
概要
accepted_if は、別の入力値に応じて同意チェックを必須化したい場合に使うバリデーションルール。
利用規約や追加オプションの同意など、条件付きフォームでの実装に向いている。
同意とみなされる値は accepted と同じ定義が使われる。
構文 / シグネチャ
'field' => 'accepted_if:other,value'
引数
| 引数 | 型 | 必須 | 説明 |
|---|---|---|---|
| other | string | yes | 判定に使う別フィールド名 |
| value | mixed | yes | other がこの値のときに有効 |
戻り値
バリデーション通過時は true 相当。失敗時は ValidationException。
accepted とみなされる値yes, on, 1, true(文字列 / 数値 / boolean)
使用例
最小例
$request->validate([
'subscribe' => ['required', 'boolean'],
'terms' => ['accepted_if:subscribe,1'],
]);
subscribe が 1 のときだけ terms の同意が必須になる。
実務例
use Illuminate\Http\Request;
public function store(Request $request)
{
$validated = $request->validate([
'plan' => ['required', 'in:free,pro'],
'pro_terms' => ['accepted_if:plan,pro'],
]);
// pro プラン選択時のみ pro_terms が必須
}
よくある落とし穴・注意
- チェックボックスが未チェックだとリクエストにキー自体が含まれない
→ JavaScript 側で hidden を用意するか、仕様として理解しておく - value は厳密比較ではない
→ boolean / 数値 / 文字列の混在に注意 - accepted_if は required_if の代替ではない
→ 同意判定専用。単なる必須化なら required_if を使う
代替・関連APIとの比較
- accepted
常に同意必須。条件分岐なし - required_if
条件付き必須だが、値の内容までは検証しない - required_unless
条件が逆になるケース向け
選定基準
同意チェックかどうかで accepted 系と required 系を使い分ける。
テスト例(Pest)
it('requires acceptance only when condition matches', function () {
$rules = [
'option' => ['required'],
'agree' => ['accepted_if:option,yes'],
];
$this->assertTrue(
validator(['option' => 'no'], $rules)->passes()
);
$this->assertFalse(
validator(['option' => 'yes'], $rules)->passes()
);
});
トラブルシュート(エラー別)
| 症状 | 原因 | 対処 |
|---|---|---|
| 常にエラーになる | value の型不一致 | リクエスト値を確認 |
| チェックしても通らない | 値が accepted 判定外 | on / 1 / true を送信 |
| フィールドが未定義 | チェック未送信 | hidden フィールド追加 |
参考リンク
- Laravel Validation — accepted_if(公式ドキュメント)
https://laravel.com/docs/validation#rule-accepted-if

