Declined If — 条件付きで「拒否」を要求するバリデーションルール

validation
  • カテゴリ: 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'
引数必須既定値説明
otherstringはいなし条件判定に使う他フィールド
valuemixedはいなし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 判定されている送信値を確認
チェックボックスで失敗未送信で nullhidden フィールド追加

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする