- カテゴリ: validation
- 掲載バージョン: Laravel 12・PHP 8.4
- 名前空間 / ルール名:
declined_if - 関連: accepted_if, declined, required_if
- 変更履歴: Laravel 9 以降で利用可
要点(TL;DR)
- 特定条件のときに「拒否(false / off / no / 0)」を強制する
declined_if:他の項目,値で使用- boolean と文字列の扱いに注意
概要
declined_if は、別の入力値が指定条件を満たす場合に、そのフィールドが「拒否」を意味する値であることを要求するバリデーションルール。
利用規約の拒否や、特定設定時にオプトアウトを強制したい場面で使われる。
構文 / シグネチャ
'field' => 'declined_if:other,value'
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| other | string | はい | なし | 条件判定に使う他フィールド |
| value | mixed | はい | なし | other がこの値のときに適用 |
- 戻り値: boolean(検証成功/失敗)
- 例外/副作用: なし
使用例
最小例
$request->validate([
'newsletter' => 'declined_if:account_type,guest',
]);
account_type が guest の場合、newsletter は拒否状態である必要がある。
実務例
use Illuminate\Http\Request;
public function store(Request $request)
{
$validated = $request->validate([
'account_type' => 'required|string',
'marketing_optin' => 'declined_if:account_type,corporate',
]);
// 法人アカウントではマーケティング同意を拒否扱いにする
}
よくある落とし穴・注意
- rejected 値の定義は Laravel 固有で、false, 0, “0”, “false”, “off”, “no” が該当
- チェックボックス未送信は null になるため、HTML 側の実装に注意
- accepted_if と対になるルールなので混同しやすい
代替・関連APIとの比較
- declined
条件なしで常に拒否を要求 - accepted_if
条件付きで同意を要求 - required_if
値の有無のみを制御したい場合はこちら
テスト例(Pest)
it('declines field when condition matches', function () {
$response = $this->post('/submit', [
'account_type' => 'guest',
'newsletter' => 'yes',
]);
$response->assertSessionHasErrors('newsletter');
});
トラブルシュート(エラー別)
| 症状 | 原因 | 対処 |
|---|---|---|
| 常に通らない | 値が accepted 判定されている | 送信値を確認 |
| チェックボックスで失敗 | 未送信で null | hidden フィールド追加 |
参考リンク
- Laravel Validation Rules – Declined If
https://laravel.com/docs/validation#rule-declined-if

