登録日:
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) のような条件でバリデーションをスキップ可能