Laravel validation rules - optional, but validated if present

Perhaps you were looking for 'nullable'?

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

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.


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