首页 > 解决方案 > Laravel:条件验证规则

问题描述

在我的 laravel 应用程序中,我需要在条件基础上应用验证规则。例如:Storemethodpassword字段是必填的,min chars: 6。但是Updatemethodpassword字段是不需要的,但是如果用户输入密码,那么它必须大于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' => '' ]);

    ....
}

标签: laravelvalidationconditional-statementsrules

解决方案


您可以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',
    ];

}

推荐阅读