Laravel条件验证怎么写

wen PHP项目 2

本文目录导读:

Laravel条件验证怎么写

  1. 使用 required_if 规则
  2. 使用 required_with / required_without
  3. 在 FormRequest 中使用条件验证
  4. 使用 sometimes 方法
  5. 自定义条件验证规则
  6. 使用 Validator::extend 创建自定义条件
  7. 动态验证规则示例
  8. 常用条件验证规则总结

在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 方法。

抱歉,评论功能暂时关闭!