Laravel验证规则-可选项,但如果存在则进行验证。

28

我正在尝试通过表单创建用户更新验证,例如传递 'password'=>NULL 或 'password'=>'newone';

我尝试仅在传递的参数不为空时进行验证,但是什么都行不通,甚至不是 'sometimes' :/

我希望进行以下验证:

Validator::make(
    ['test' => null], 
    ['test' => 'sometimes|required|min:6']
)->validate();

但它未通过验证。


你要么使用 sometimes 要么使用 required,它们是互斥的。如果你只使用 sometimes,则只有在不为空时才会进行验证。 - Marco Aurélio Deleu
是的,但如果将值作为NULL传递,sometimes也会导致测试失败 :/ 我想问题在于传递了NULL值... - GTMeteor
5个回答

50

也许您正在寻找'nullable'

'test'=> 'nullable|min:6'

14

虽然这个问题有点老,但这就是你应该做的方式。对于这么简单的东西,你不需要在代码上花费太多精力。

你需要在验证规则上同时使用nullable和sometimes,例如:

$this->validate($request, [
  'username' => 'required|unique:login',
  'password' => 'sometimes|nullable|between:8,20'
]);

以上仅在字段有某些值时进行验证,如果没有值或传递了null,则会忽略。这种方式能够很好地实现。


3

3
不要在验证器中使用'required',请按以下方式进行验证。
$this->validate($request, [
    'username' => 'required|unique:login',
    'password' => 'between:8,20'
]);

上面的验证器只有在密码存在且长度在8到20之间时才会接受密码。

这是我在我的用例中所做的。

case 'update':
                $rules = [
                            'protocol_id' => 'required',
                            'name' => 'required|max:30|unique:tenant.trackers'.',name,' . $id, 
                            'ip'=>'required',
                            'imei' => 'max:30|unique:tenant.trackers'.',imei,' . $id, 
                            'simcard_no' => 'between:8,15|unique:tenant.trackers'.',simcard_no,' . $id, 

                            'data_retention_period'=>'required|integer'
                         ];  
            break;

这里的跟踪器可能有或没有sim卡号,如果有,则长度为8到15个字符。

更新

如果您仍然想要传递硬编码的“NULL”值,则在验证器中添加以下内容

$str='NULL';
$rules = [
    password => 'required|not_in:'.$str,
];

如果字段为空,他故意发送 null。所以你的答案不起作用!那是我的第一个答案,所以我更新了它! - lewis4u
没错,但他并没有像其他人一样使用Laravel……即使这些值没有填充,他也会发送所有的值……所以用你的解决方案,null将被验证,且不超过6个字符,从而显示验证错误! - lewis4u
这是OP的问题,也是你的问题。Laravel的风格就是这样的...你可以自由地点踩 :) - sumit
你没有仔细阅读我的内容。在 Laravel 中,如果按照文档使用,空的输入字段不会随请求一起发送!但是 OP 已经自定义使其在输入字段为空时发送 null!如果你设置规则来检查任何东西:例如 min:6,它将检查该字段上的 null,并且 null 没有足够的字符,这将导致验证错误! - lewis4u
没问题,只需用“min:6|not_in:'.$str'”替换“required”。 - lewis4u
1
他显然是个初学者,但我也曾经如此... 时间会证明一切的 ;) (只要他继续使用Laravel) - lewis4u

2
相关的验证规则如下:
  • required(必填)
  • sometimes(有时需要填写)
  • nullable(可以为空)
这些规则都有其用途,您可以在此处进行检查:https://laravel.com/docs/5.8/validation#rule-required 如果您希望验证始终生效,请参考以下链接:https://laravel.com/docs/5.8/validation#conditionally-adding-rules 如果您希望有时应用验证规则,请参考以下链接:https://laravel.com/docs/5.8/validation#a-note-on-optional-fields
如果您希望属性值也可以为空,请使用“nullable”规则。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接