本文目录导读:

- 使用
required_if规则 - 使用
required_with/required_without - 在 FormRequest 中使用条件验证
- 使用
sometimes方法 - 自定义条件验证规则
- 使用
Validator::extend创建自定义条件 - 动态验证规则示例
- 常用条件验证规则总结
在Laravel中,条件验证有多种实现方式,以下是几种常用的方法:
使用 required_if 规则
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'phone' => 'required_if:contact_method,phone|numeric',
'address' => 'required_if:contact_method,mail',
]);
使用 required_with / required_without
$rules = [
'password' => 'required_with:password_confirmation|string|min:8',
'password_confirmation' => 'required_with:password|string|same:password',
'credit_card' => 'required_without:paypal|string',
'paypal_email' => 'required_without:credit_card|email',
];
在 FormRequest 中使用条件验证
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class StoreUserRequest extends FormRequest
{
public function rules()
{
$rules = [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
];
// 根据条件添加规则
if ($this->input('user_type') === 'admin') {
$rules['admin_code'] = 'required|string|max:50';
$rules['permissions'] = 'required|array';
}
// 根据请求方法添加规则
if ($this->isMethod('PUT') || $this->isMethod('PATCH')) {
$rules['email'] = 'required|email|unique:users,email,' . $this->route('id');
}
return $rules;
}
}
使用 sometimes 方法
$validator = Validator::make($request->all(), [
'email' => 'required|email',
'promo_code' => 'string|max:20',
]);
// 条件验证:只有当用户选择了某种支付方式时才验证
$validator->sometimes('promo_code', 'required|min:6', function ($input) {
return $input->payment_method === 'credit_card' && $input->amount >= 100;
});
// 多个字段的条件验证
$validator->sometimes(['address', 'city', 'zip'], 'required', function ($input) {
return $input->shipping_method === 'physical';
});
自定义条件验证规则
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
$validator = Validator::make($request->all(), [
'status' => [
'required',
Rule::in(['active', 'inactive', 'pending']),
],
'publish_date' => [
'required_if:status,published',
'date',
function ($attribute, $value, $fail) use ($request) {
if ($request->input('status') === 'published' && strtotime($value) > time()) {
$fail('发布日期不能是未来日期。');
}
},
],
]);
使用 Validator::extend 创建自定义条件
// 在 AppServiceProvider 的 boot 方法中
Validator::extend('conditional_required', function ($attribute, $value, $parameters, $validator) {
$data = $validator->getData();
$conditionField = $parameters[0] ?? null;
$conditionValue = $parameters[1] ?? null;
if (isset($data[$conditionField]) && $data[$conditionField] == $conditionValue) {
return !empty($value);
}
return true;
}, ':attribute 是必填项。');
// 使用
$rules = [
'coupon_code' => 'conditional_required:payment_method,paypal',
'bank_account' => 'conditional_required:payment_method,bank_transfer',
];
动态验证规则示例
public function store(Request $request)
{
$rules = [
'user_type' => 'required|in:individual,company',
'name' => 'required|string',
];
// 根据用户类型动态添加规则
switch ($request->input('user_type')) {
case 'individual':
$rules['id_card'] = 'required|string|max:18';
break;
case 'company':
$rules['business_license'] = 'required|string|max:50';
$rules['tax_id'] = 'required|string|max:20';
break;
}
// 根据请求中的数量动态调整
$itemsCount = count($request->input('items', []));
for ($i = 0; $i < $itemsCount; $i++) {
$rules["items.{$i}.name"] = 'required|string';
$rules["items.{$i}.quantity"] = 'required|integer|min:1';
$rules["items.{$i}.price"] = 'required|numeric|min:0';
}
$validator = Validator::make($request->all(), $rules);
if ($validator->fails()) {
return response()->json(['errors' => $validator->errors()], 422);
}
// 处理业务逻辑...
}
常用条件验证规则总结
| 规则 | 说明 |
|---|---|
required_if:field,value |
当指定字段等于特定值时必填 |
required_unless:field,value |
当指定字段不等于特定值时必填 |
required_with:foo,bar |
当指定字段存在时必填 |
required_with_all:foo,bar |
当所有指定字段都存在时必填 |
required_without:foo,bar |
当指定字段缺失时必填 |
required_without_all:foo,bar |
当所有指定字段都缺失时必填 |
prohibited_if:field,value |
当指定字段等于特定值时禁止出现 |
选择哪种方式取决于你的具体需求,对于简单的条件验证,使用内置规则即可;对于复杂的业务逻辑,建议使用 FormRequest 或 sometimes 方法。