Laravel有时会验证规则

Ste*_*978 9 php validation laravel

我正在尝试验证密码字段,只有它存在.我想允许某人编辑用户,他们可能想要也可能不想更改用户密码.所以我认为我可以使用Laravels验证规则,特别是"有时"规则.我有这套规则:

$this->validate($request, [
    'password' => 'sometimes|required|min:8',
]);
Run Code Online (Sandbox Code Playgroud)

这是简化的示例,通常会有其他字段的其他规则和更严格的密码规则.我希望这只应用min:8规则,如果传递的数据中存在密码字段,但如果我将密码字段留空,我会收到验证错误,说明密码字段是必需的.

我不确定我在文档中没有理解什么.我是否需要在验证之前手动删除密码字段,如果表单输入提交为空这样?

$data = $request->all();

if ('' === $data['password']) {
    unset($data['password'])
}
Run Code Online (Sandbox Code Playgroud)

...然后将数组传递给验证器.我认为这是有道理的,但我可以做一些确认,我正确理解它.提前致谢.

Cle*_*ode 12

我想我们应该告诉laravel如果密码不是空的,那么规则就是什么都不做.

$this->validate($request, [
  'password' => $request->password != null ?'sometimes|required|min:8': ''
]);
Run Code Online (Sandbox Code Playgroud)


Nab*_*war 8

文档没有说清楚,但删除必需使它工作.

$this->validate($request, [
    'password' => 'sometimes|min:8',
]);
Run Code Online (Sandbox Code Playgroud)


Alm*_*itt 7

“我试图仅在密码字段存在时才对其进行验证。”

为此,您可以在验证系统中使用“可为空”规则。

例如:

$this->validate($request, [
    'password' => 'sometimes|nullable|min:8',
]);
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看“关于可选字段的说明”下的https://laravel.com/docs/5.6/validation部分


iva*_*hoe 6

这是一个老问题,但上面的答案有很多混乱。这是目前谷歌上关于“有时验证规则”的第一个结果,所以我希望我能为其他谷歌用户澄清一些事情:

规则的sometimes运作方式如下:

  • 如果该字段存在于请求中,则使用其余规则对其进行验证;
  • 如果该字段不存在,则不执行任何操作。

请注意,不存在意味着该字段从未提交( isset($_POST['password']) === false),它与使用空字符串或 null 或 0 值提交的字段不同 - 因此 'sometimes|required|min:8'仅当表单根本没有密码字段时才有效,或者它已被禁用,因此永远不会提交。

如果密码字段存在,只是留空,然后提交表单,我们仍然会得到它,'password' => null因为sometimes这意味着它存在,因此将应用其余规则(并且由于必填字段不能为空,因此请求将失败) 。

OP真正需要的是:

'password' => 'nullable|min:8',
Run Code Online (Sandbox Code Playgroud)

假设密码字段始终存在于请求中,只是有时其值可以留空。