本文目录导读:

- 使用
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 方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播