【问题标题】:Laravel 5.4 sometimes|required validation not raising on "null" inputLaravel 5.4 有时|需要验证不会在“空”输入时引发
【发布时间】:2017-09-08 21:43:08
【问题描述】:

我在验证有时只会出现在请求中的输入时遇到问题。

// Controller
public function update(Request $request, User $user)
{    
    $updateResult = $user->updateUser($request);
    return dd($updateResult);
}

// User Model

protected $validation = [
    'rules' => [
        'email' => [
            'sometimes',
            'email',
            'required',
        ],
        'password' => [
            'sometimes',
            'min:6',
            'required',
        ],
        'first_name' => [
            'sometimes',
            'required',
        ],
        'last_name' => [
            'sometimes',
            'required',
        ],
    ],
    'messages' => [
        'email.required' => 'An email is required.',
        'email.email' => 'The email must be valid.',
        'password.required' => 'A password is required.',
        'password.min' => 'Your password must be at least six (6) characters long.',
        'first_name.required' => 'Your first name is required.',
        'last_name.required' => 'Your last name is required.',
    ],
];

public function updateUser(Request $request)
{
    $validation = Validator::make($request->all(), [
        $this->validation['rules'],
        $this->validation['messages'],
    ]);

    if ($validation->fails())
    {
        return $validation;
    }

    else
    {
        return "OK";
    }
}

所以在一些更新页面中 $request->all() 只会有这些字段的一个子集。但是,即使存在字段,但值为 null,required 也不会触发。

[
    'first_name' => null,
    'last_name' => 'Davidson',
    'job_title' => 'Tech Support',
]

上面的请求数组将返回“OK”...如果我有时从字段中删除,那么当发送部分输入请求时,它会失败说字段是必需的。

我正在清除此处遗漏的一些内容,但通过阅读文档,我认为我已正确配置:

在某些情况下,您可能希望针对 仅当该字段存在于输入数组中时。要快速 完成此操作,将有时规则添加到您的规则列表中:

$v = 验证器::make($data, [ '电子邮件' => '有时|需要|电子邮件', ]);

【问题讨论】:

    标签: php laravel validation laravel-5.4


    【解决方案1】:

    您面临的问题仅仅是由于您调用验证器时出错。第二个参数不是您传递的多维数组。规则数组和消息数组是单独的参数。

    $validation = Validator::make($request->all(), [
        $this->validation['rules'],
        $this->validation['messages'],
    ]);
    

    应该换成

        $validation = Validator::make($request->all(),
            $this->validation['rules'], $this->validation['messages']);
    

    【讨论】:

    • 这就是我喜欢 stackoverflow 的地方... 多一双眼睛。这严重推动了我的精神。我真的不知道那个数组是如何到达那里的,它一定是建立规则的肌肉记忆。好接!再次感谢。
    【解决方案2】:
    'first_name' => [
            'sometimes',
            'required',
        ],
    

    永远不会按预期工作。有时表示:如果有事情发生,下一个规则是什么?在这种情况下是“必需的”。需要什么?将其更改为:

    'first_name' => [
            'sometimes',
            'required',
            'min:1',
        ],
    

    如果没有给出输入,null 值仍然是 null 值并且不会失败。如果要保留表中字段的值以进行更新,请使用其受尊重的值填充表单中的输入。

    空值以'' 发送,并被app\Http\kernel.php 中间件中的ConvertEmptyStringsToNull::class 置空。

    【讨论】:

    • 有时需要的规则是一个完全有效的场景。它基本上说:“如果一个字段存在,那么它不能为空或空”
    【解决方案3】:

    在 Laravel 5.4 中,空字符串由 ConvertEmptyStringsToNull 中间件转换为 Null...这可能会给您带来一些问题...

    您应该为所有可选验证添加 nullable...

    希望对你有帮助

    【讨论】:

    猜你喜欢
    • 2017-10-19
    • 2017-08-13
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2019-01-31
    • 2020-08-04
    相关资源
    最近更新 更多