欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel 5.4 5.5 验证规则-可选,但经过验证(如果存在); 有大用


lavarel  5.5 中  可选字段注意事项 

'password' => 'nullable|min:8|confirmed';  反正在 5.2 当中是 不需要nullable的, 但如果在5.5中 若没有 nullable ,
(提交时假如为空时)就是会执行 min:8 的验证,就会报错.


默认情况下,Laravel自带了 TrimStrings 和 ConvertEmptyStringsToNull 中间件,这两个中间件位于 App\Http\Kernel 类的全局中间件堆栈中,因为这个原因,你需要经常将“可选”的请求字段标记为 nullable —— 如果你不想让验证器将 null 判定为无效的话。例如:

在这个例子中,我们指定 publish_at 字段可以为 null 或者有效的日期格式。如果 nullable 没有被添加到验证规则,验证器会将 null 判定为无效日期。


来自  https://xueyuanjun.com/post/7978



 
活动 2个月前    
观看了 13k次    
9                    

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

我试图使它仅在不传递为null的情况下验证,并且什么也没有,甚至“有时”也没有效果:/                    

我正在尝试验证为:                    

Validator::make(array('test'=>NULL), array('test'=> 'sometimes|required|min:6'))->validate();
                   

但是它无法验证...:/感激不尽。                    

改善这个问题                            
  • 您可以使用sometimesrequired它们是互斥的。如果您只是有时使用它,则在不为空的情况下将对其进行验证。 –  MarcoAurélioDeleu 17年 2月18日在18:58                                
  • 是的,但是sometimes如果将值作为NULL传递也会使测试失败:/我猜,问题出在传递NULL值…… – GTMeteor 17年  2月18日,19:45                                 
       

6个答案                

活跃的最古老的选票                    
       
21                        

也许您在寻找“可空的”                        

'test'=> 'nullable|min:6'
                   
改善这个答案                            
       
2                        

我想你在找filled。 https://laravel.com/docs/5.4/validation#rule-filled                        

改善这个答案                            
       
1个                        

不要在验证器上通过“必需”                            

验证如下                        

$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,
];
                   
改善这个答案                            
  • 如果该字段为空,则故意发送空值。所以你的答案不起作用!那是我的第一个答案,所以我更新了它! – lewis4u 17年  2月18日在20:23                                     
  • 它必须努力,这是多么laravel验证工作...... -  SUMIT 2月18日'17 20:25                                    
  • 没错,但是他没有像其他所有人一样使用laravel ...即使没有填充,他也正在发送所有值。...因此,使用您的解决方案,必须验证null且其值不超过6字符,它显示验证错误!!! – lewis4u 17年  2月18日在20:27                                     
  • 那么它的OP问题,以及您的问题。Laravel风格总是这样..你可以自由downvote :) -  SUMIT 在20:30 02月18日'17                                    
  • 1个                                    
    他显然是个初学者,但是我也是如此……随着时间的流逝,他会来;)(如果他继续使用Laravel) –  lewis4u 17 Feb 18 '17:20                                     
       
1个                        

尽管问题有点老了,但这是您应该如何做。您不需要在如此简单的事情上花费那么多代码就进行如此艰巨的努力。                        

您需要同时具有nullable和有时具有验证规则,例如:                        

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

仅当该字段具有某个值时,以上内容才会生效;如果不存在任何值,或者它传递了null,则将忽略。这很好。                        

改善这个答案                            
       
0                        

相关的验证规则是:                        

  • 需要

  • 有时

  • 可为空

它们都有用途,可以在这里检查:                        

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                        

如果您也希望属性也允许null为值                        

改善这个答案                            
       
-1                        

如果您故意发送空值,则为验证设置if条件:                        

if ($request->test != null)
    Validator::make(array('test' => 'min:6'))->validate();
}
                   
改善这个答案                            
  • 但这并不能解决问题,因为我的表单组件将空字段作为NULL值传递,并且NULL没有通过min:6测试。我以为验证器可能有一些聪明的方法可以完全忽略NULL值…… – GTMeteor 17年  2月18日在19:43                                    
  • 没错,因为我还使用了Vue.js ajax指令,这些指令使用formData序列化了数据…… – GTMeteor 17年  2月18日,19:57                                    
  • 这个答案很有趣,使用if else覆盖验证,您可以轻松编写(if($ request-> test == NULL || strlen($ request-> test)> 0),甚至不必编写验证规则。我不会下票你,你仍然是新laravel :) -  SUMIT 2月18日在'17 20:34                                     
  • 但是他只想在输入不为null时对其进行验证,您将如何解决呢?我在这里学习! – lewis4u 17年  2月18日在20:35                                    
  • 我们根本不必打扰。laravel将处理它 -  萨米特 在20:36 02月18日'17                                    
       

来自    https://stackoverflow.com/questions/42319050/laravel-5-4-validation-rules-optional-but-validated-if-present            


Asked 
Active 2 months ago    
Viewed 13k times
9

I'm trying to create a user update validation through form, where I pass, for example 'password'=>NULL, or 'password'=>'newone';

I'm trying to make it validate ONLY if it's passed as not null, and nothing, not even 'sometimes' works :/

I'm trying to validate as :

Validator::make(array('test'=>NULL), array('test'=> 'sometimes|required|min:6'))->validate();
                   

But it fails to validate... :/ ANy help would be appreciated.

improve this question                            
  • You either use sometimes or required. They're mutually exclusive. If you just use sometimes, it will be validated if it's not empty. – Marco Aurélio Deleu Feb 18 '17 at 18:58                                
  • Yeah, but sometimes also makes the test fail if the value is passed as NULL :/ I guess, the problem then lies in passing NULL values... – GTMeteor Feb 18 '17 at 19:45                                 
       

6 Answers

activeoldestvotes                    
       
21

Perhaps you were looking for 'nullable'?

'test'=> 'nullable|min:6'
                   
improve this answer                            
       
2

I think you are looking for filledhttps://laravel.com/docs/5.4/validation#rule-filled                        

improve this answer                            
       
1

Do not pass 'required' on validator

Validate like below

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

The above validator will accept password only if they are present but should be between 8 and 20

This is what I did in my use case

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;
                       

Here the tracker may or may not have sim card number , if present it will be 8 to 15 characters wrong

Update

if you still want to pass hardcoded 'NULL' value then add the following in validator

$str='NULL';
$rules = [
    password => 'required|not_in:'.$str,
];
                   
improve this answer                            
  • he is sending null on purpose if the field is empty. so your answer doesn't work! that was my first answer so i updated it! – lewis4u Feb 18 '17 at 20:23                                     
  • It must work , this is how laravel validation work... – sumit Feb 18 '17 at 20:25                                    
  • True, but he is not using laravel as all the others do...he is sending all the values even though they are not populated....so with your solution null gets to be validated and it doesn't have more than 6 chars and it shows a validation error!!! – lewis4u Feb 18 '17 at 20:27                                     
  • Well its OP problem, and your as well. Laravel style is always like that.. you are free to downvote :) – sumit Feb 18 '17 at 20:30                                    
  • 1                                    
    He is obviously a beginner, but so was I... it will come to him with time ;) (if he continues to use Laravel) – lewis4u Feb 18 '17 at 20:48                                     
       
1

Though the question is a bit old, this is how you should do it. You dont need to struggle so hard, with so much code, on something this simple.

You need to have both nullable and sometimes on the validation rule, like:

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

The above will validate only if the field has some value, and ignore if there is none, or if it passes null. This works well.

improve this answer                            
       
0

The relevant validation rules are:

  • required

  • sometimes

  • nullable

All have their uses and they can be checked here:

https://laravel.com/docs/5.8/validation#rule-required                        

if you want validation to always apply                        

https://laravel.com/docs/5.8/validation#conditionally-adding-rules                        

if you want to apply validation rules sometimes                        

https://laravel.com/docs/5.8/validation#a-note-on-optional-fields                        

if you want your attribute to allow for null as value too

improve this answer                            
       
-1

If you are sending null on purpose then make an if condition for validation:

if ($request->test != null)
    Validator::make(array('test' => 'min:6'))->validate();
}
                   
improve this answer                            
  • That doesn't solve the issue, as my form components pass empty fields as NULL values, and NULL doesn't pass min:6 test. I thought maybe the validator has some smart methods to ignore NULL values alltogether... – GTMeteor Feb 18 '17 at 19:43                                    
  • That's correct, as I'm also using Vue.js ajax directives that serialize the data with formData... – GTMeteor Feb 18 '17 at 19:57                                    
  • This answer is funny , overriding validation with if else , you can easily write (if($request->test==NULL || strlen($request->test)>0) , even do not have to write validation rule. But I wont down vote you as you are still new to laravel :) – sumit Feb 18 '17 at 20:34                                     
  • But he wants to validate it only if the input is not null, how would you solve that? I am here to learn! – lewis4u Feb 18 '17 at 20:35                                    
  • We dont have to bother at all. laravel will handle it – sumit Feb 18 '17 at 20:36                                    
       

来自   https://stackoverflow.com/questions/42319050/laravel-5-4-validation-rules-optional-but-validated-if-present            


普通分类: