Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

simik's avatar

Calling standard validation rules from a custom validation rule?

Is there a way to call a standard validation rule from my custom validation rule?

I have a form with several file inputs, all inputs have the same name images[]. I want to validate that there's at least one element in images array, and that all files in images array are images.

It would be nice to use standard image rule for that. Is there a way to do this?

0 likes
4 replies
simik's avatar

After studying Illuminate\Validation\Validator class I don't see any way to call rule validation methods (like validateImage) from outside the class. So, I guess, I should either create my own subclass of Validator, or just duplicate the logic of validateImage in my custom validation rule.

rodrigo.pedra's avatar

Are you using Laravel 5's FormRequest?

If so, try this:

<?php namespace App\Http\Requests;

class MyRequest extends Request
{
    public function rules()
    {
        // check if the array contains between 1 and 8 elements
        // you can remove max if you don't need it
        $rules = [ 'images' => 'required|array|min:1|max:8' ];

        $images = $this->get( 'images' );

        if ( !empty( $images ) )
        {
            foreach ( $images as $key => $image ) // add individual rules to each image
            {
                $rules[ sprintf( 'images.%d', $key ) ] = 'required|image';
            }
        }

        return $rules;
    }
    
    public function authorize () {
        return true;
    }
}
2 likes
simik's avatar

Yes, I'm using Laravel 5 and FormRequest.

Your code almost worked. I had to replace

$images = $this->get( 'images' );

with

$images = $this->file('images');

But then there's another problem. The $images array always contains six elements (per the number of file input elements on the page), unfilled inputs result in null elements. It precludes min (or required) rule from working properly.

So, I had to add a custom validation rule nonEmptyArray. I placed it in my custom FormRequest like this:

public function validator(\Illuminate\Validation\Factory $factory)
{
    \Validator::extend('nonEmptyArray', function($attribute, $value, $parameters) {
        return ( is_array($value) && count(array_filter($value)) > 0 );
    });

    $validator = $factory->make(
        $this->all(), $this->container->call([$this, 'rules']), $this->messages(), $this->attributes()
    );
        
    return $validator;
}

And the final rules() function:

public function rules()
{
    $rules = [ 'images' => 'required|non_empty_array' ];

    $images = $this->file( 'images' );

    if ( !empty( $images ) )
    {
        foreach ( $images as $key => $image ) // add individual rules to each image
        {
            $rules[ sprintf( 'images.%d', $key ) ] = 'image';
        }
    }

    return $rules;
}
1 like

Please or to participate in this conversation.