简体   繁体   中英

Laravel validation rules - optional, but validated if present

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(
    ['test' => null], 
    ['test' => 'sometimes|required|min:6']
)->validate();

But it fails to validate.

Perhaps you were looking for 'nullable' ?

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

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

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,
];

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.

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

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();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM