Laravel 5.4有时会要求验证不要提高“null”输入

时间:2017-04-12 22:54:31

标签: php laravel validation laravel-5.4

我在验证输入时遇到问题,这些输入有时会出现在请求中。

// 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,所需的不会触发。

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

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

我在这里清除遗漏的东西,但是从阅读文档我认为我已经正确配置了这个:

  

在某些情况下,您可能希望对a执行验证检查   仅当输入数组中存在该字段时才输入字段。快点   完成此操作,将有时规则添加到规则列表中:

     

$ v = Validator :: make($ data,[       'email'=> '有时|必需|电子邮件',]);

3 个答案:

答案 0 :(得分:3)

您遇到的问题仅仅是由于您对验证程序的调用出错。您传递的第二个参数不是多维数组。 rules数组和messages数组是单独的参数。

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

应替换为

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

答案 1 :(得分:1)

在Laravel 5.4中,ConvertEmptyStringsToNull中间件将空字符串转换为Null ...这可能会导致一些问题......

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

希望这有帮助

答案 2 :(得分:0)

'first_name' => [
        'sometimes',
        'required',
    ],

永远不会按预期工作。有时表示:如果出现问题,下一条规则是什么?在这种情况下'必需'。要求什么?将其更改为:

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

如果没有给出输入并且不会失败,则null值仍为空值。如果要在表中保留字段的值以进行更新,请使用其所需的值填充表单中的输入。

null值作为''发送,并由app \ Http \ kernel.php中间件中的ConvertEmptyStringsToNull::class取消。