Search code examples
phplaravellaravel-validation

Laravel request validation image required in create but not required in update


ProductsRequest.php code:

public function rules()
{
    return [
        'name'          => 'required
                            |min:'.trans('validation_standards.names.min').'
                            |max:'.trans('validation_standards.names.max').'
                            |unique:products,name,'.$this -> product_id,


        'barcode'       => 'size:'.trans('validation_standards.barcode.size').'
                            |unique:products,barcode,'.$this -> product_id,

        'category_id'   => 'required
                            |exists:categories,id',

        'seasons_id'    => 'required
                            |exists:seasons,id',

                           // REQUIRED IMAGE ONLY IN STORE
        'image'         => 'required
                            |image|mimes:'.trans('validation_standards.images.extensions').'
                            |max:'.trans('validation_standards.images.file_size'),

        'description'   => 'nullable
                            |min:'.trans('validation_standards.descriptions.min').'
                            |max:'.trans('validation_standards.descriptions.max'),
    ];
}

These rules apply for both store and update methods.

Problem is:

I want the image to be required only on store and not required in update, since user can just update the product basic info without choosing a new image for the product every time he update the product.

What I have tried:

I have tried to create two different ProductsRequest one for store and other for update but I know that this achievement is not the best achievement because my code must be DRY.


Solution

  • You can do this in your ProductsRequest file;

    public function rules()
    {
        if(request()->isMethod('put')) // could be patch as well
        {
             // Update rules here - Don't require image here
    return [
        'name' => 'required
                  |min:'.trans('validation_standards.names.min').'
                  |max:'.trans('validation_standards.names.max').'
                  |unique:products,name,'.$this->product_id,
        'barcode' => 'size:'.trans('validation_standards.barcode.size').'
                     |unique:products,barcode,'.$this->product_id,
    
        'category_id'   => 'required|exists:categories,id',
    
        'seasons_id'    => 'required|exists:seasons,id',
    
                           // REQUIRED IMAGE ONLY IN STORE
        'image' => 'required|image|mimes:'.
                    trans('validation_standards.images.extensions').'                         
                    |max:'.trans('validation_standards.images.file_size'),
        'description' => 'nullable                        
                    |min:'.trans('validation_standards.descriptions.min').'                      
                    |max:'.trans('validation_standards.descriptions.max'),
    ];
        }else{
             // store rules here - require image here
             return [
        'name' => 'required
                  |min:'.trans('validation_standards.names.min').'
                  |max:'.trans('validation_standards.names.max').'
                  |unique:products,name,'.$this->product_id,
        'barcode' => 'size:'.trans('validation_standards.barcode.size').'
                     |unique:products,barcode,'.$this->product_id,
    
        'category_id'   => 'required|exists:categories,id',
    
        'seasons_id'    => 'required|exists:seasons,id',
    
                           // REQUIRED IMAGE ONLY IN STORE
        'image' => 'image|mimes:'.
                    trans('validation_standards.images.extensions').'                         
                    |max:'.trans('validation_standards.images.file_size'),
        'description' => 'nullable                        
                    |min:'.trans('validation_standards.descriptions.min').'                      
                    |max:'.trans('validation_standards.descriptions.max'),
    ];
        }
    }
    
    }