役立つ情報
登録日: 2025-03-06   最終更新日: 2025-03-23

Laravel バリデーション除外する方法

Laravel でバリデーションを除外する方法はいくつかあります。
用途に応じて適切な方法を選んでください。

sometimes ルールを使う(値がある場合のみバリデーション)

フォームの項目が 送信されている場合のみ バリデーションを適用したい場合は、sometimes ルールを使います。


public function rules(): array
{
    return [
        'title' => 'sometimes|string|max:100', // 送信された場合のみバリデーション
        'content' => 'required|string',
    ];
}

ポイント

  • title が 送信されなければバリデーションされない(エラーも発生しない)
  • content は 必須 のため、送信されなければエラー

nullable ルールを使う(未入力を許可)

項目が 空の場合にエラーを出さず、無視する 場合は、nullable を使います。


public function rules(): array
{
    return [
        'keyword' => 'nullable|string|max:450', // 未入力ならエラーなし
        'description' => 'nullable|string|max:450',
    ];
}

ポイント

  • nullable を指定すると、空文字や未入力のときにバリデーションをスキップ
  • max:450 は 入力された場合のみ適用

exclude_if で特定条件でバリデーションを除外

例えば、type が "free" の場合は price のバリデーションを無効化したい場合。


public function rules(): array
{
    return [
        'type' => 'required|string',
        'price' => 'exclude_if:type,free|numeric|min:1', // type が "free" なら price を無視
    ];
}

ポイント

  • type が "free" のとき、price は バリデーション対象から完全に除外される

exclude_unless で特定条件を満たさない場合に除外

例えば、type が "premium" なら price を必須にしたい場合。


public function rules(): array
{
    return [
        'type' => 'required|string',
        'price' => 'exclude_unless:type,premium|required|numeric|min:1',
    ];
}

ポイント

  • type が "premium" 以外 の場合、price は バリデーション対象外
  • premium のときのみ required|numeric|min:1 が適用される

exclude で完全にバリデーション対象から除外

バリデーションから完全に 削除したい 場合は exclude を使います。


public function rules(): array
{
    return [
        'token' => 'exclude', // 完全にバリデーション対象外
    ];
}

ポイント

  • exclude を使うと、そのフィールドは バリデーション対象から完全に消える
  • 送信されても リクエストデータに含まれない

コントローラー側でバリデーションをスキップ

場合によっては、コントローラー側でバリデーションをスキップできます。


use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

public function store(Request $request)
{
    // 条件によってバリデーションを適用しない
    if ($request->skip_validation) {
        return response()->json(['message' => 'Validation skipped']);
    }

    $validator = Validator::make($request->all(), [
        'title' => 'required|string|max:100',
        'content' => 'required|string',
    ]);

    if ($validator->fails()) {
        return response()->json($validator->errors(), 422);
    }

    return response()->json(['message' => 'Validation passed']);
}

ポイント

  • if ($request->skip_validation) のような条件でバリデーションをスキップ可能

Copyright 役立つ情報.net