Laravel: 条件验证规则

Laravel: conditional validation rules

在我的 laravel 应用程序中,我需要在条件基础上应用验证规则。例如:在 Store 方法中,password 字段是必需的,最小字符数:6。但是,在 Update 方法中,password 字段不是必需的,但是,如果用户输入密码必须大于6个字符。

SomeController.php

private function validations($customRules = [])
{
    # variables
    $rules = [
        'contact_person' => 'required|min:2',
        'mobile_number'  => 'required|numeric',
        'pword'          => 'required|min:6',
        'email'          => 'required|email',
        'address'        => 'required',
        'status'         => 'required',
    ];
    $messages = [
        'contact_person.required' => '`<strong class="style-underline">Contact person</strong>` - Required',
        'contact_person.min'      => '`<strong class="style-underline">Contact person</strong>` - Must be at least :min chars',

        'mobile_number.required' => '`<strong class="style-underline">Mobile number</strong>` - Required',
        'mobile_number.numeric'  => '`<strong class="style-underline">Mobile number</strong>` - Must be a numeric value',

        'email.required' => '`<strong class="style-underline">Eamil</strong>` - Required',
        'email.email'    => '`<strong class="style-underline">Email</strong>` - Must be a valid email address',

        'pword.required' => '`<strong class="style-underline">Password</strong>` - Required',
        'pword.min'      => '`<strong class="style-underline">Password</strong>` - Must have a at least :min characters',

        'status.required' => '`<strong class="style-underline">Status</strong>` - Required',
    ];

    if(!empty($customRules))
        $rules = \array_merge($rules, $customRules);

    # returning
    return request()->validate($rules, $messages);
}

修改规则后,根据update方法要求,对pword字段进行最小字符验证。这不应该发生,因为该字段留空。

目前我被迫这样做。

public function update()
{
    ...

    # validating submitted data
    if(!empty(request()->pword))
        $this->validations([ 'pword' => 'min:6' ]);
    else
        $this->validations([ 'pword' => '' ]);

    ....
}

您可以使用 nullabe 而不是 required,如果您使用 eloquent,空白值将转换为 null,因为下面的中间件

    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,

所以你的方法会像

private function validations($request,$update = false){
    $rules = [
        'contact_person' => 'required|min:2',
        'mobile_number'  => 'required|numeric',
        'pword'          => 'nullable|min:6',
        'email'          => 'required|email',
        'address'        => 'required',
        'status'         => 'required',
    ];

}