Laravel 创建时需要请求验证图像但更新时不需要

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'),
    ];
}

这些规则适用于 store 和 update 方法。

Problem is:

我希望图像仅在 store 中需要,而在 update 中不需要,因为用户可以只更新产品基本信息无需每次更新产品时都为产品选择新图像。

What I have tried:

我尝试创建两个不同的 ProductsRequest,一个用于存储,另一个用于更新,但我知道这个成就不是最好的成就,因为我的代码必须是 DRY。

使用required_without规则

如果您的数组中存在主键和名称为 id 的元素

'image'         => 'required_without:id`

如果您的数组中存在主键和名称为 product_id 的元素

 'image'         => 'required_without:product_id`

您可以从 laravel validation

获取更多详细信息

您可以在 ProductsRequest 文件中执行此操作;

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'),
];
    }
}

}

就这几行就可以解决你的问题... 你必须检查那里的图像有没有,像这样。

私有或受保护函数中的规则

  private function validateRequest($request)
     {
        //This is for Update without required image, this will check that In DB image have or not

        $product = Product::find($request->product_id);
        $rules = [];
        if ($product) :
           if ($product->product_image == null):
              $rules['product_image'] = 'required|image|max:1999';
           endif;



     //This is for regular validation
       else :
          $rules = [
               'category_id'   => 'required|integer|not_in:-- Select Category --',
               'product_image' => 'required|image|max:1999',
             ];
       endif;
         return $rules;
    }
public function rules()
{
    $image = request()->isMethod('put') ? 'nullable|mimes:jpeg,jpg,png,gif,svg|max:8000' : 'required|mimes:jpeg,jpg,png,gif,svg|max:8000';
    return [
        'image' => $image,

    ];
}

如果你的路线是这样的(应该是)

 Route::post('products/{id}/update', 'ProductController@updateProduct')->name('products.update');

您将这条路线称为

route('products.update', $product->id);

$product->id 将在您的表单请求中可用,您可以像这样验证创建和更新的表单请求。

public function rules() {
        return [
            // All other rules
            'image' => $this->id == null ? 'required|image|mimes:'.
                trans('validation_standards.images.extensions').'                         
                |max:'.trans('validation_standards.images.file_size') : 
                'image|mimes:'.trans('validation_standards.images.extensions').'                         
                |max:'.trans('validation_standards.images.file_size')
        ];
    }