Laravel请求验证映像在创建中是必需的,但在更新中不是必需的

时间:2018-11-23 17:45:02

标签: php laravel laravel-validation

  

ProductsRequest.php 代码:

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

这些规则适用于存储和更新方法。

  

问题是:

我希望仅在商店上需要该图像,而在更新中不要求该图像,因为用户可以仅更新产品基本信息而无需为该产品选择新图像每次他更新产​​品时。

  

我尝试过的事情:

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

5 个答案:

答案 0 :(得分:2)

您可以在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'),
];
    }
}

}

答案 1 :(得分:1)

使用required_without规则

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

'image'         => 'required_without:id`

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

 'image'         => 'required_without:product_id`

您可以从laravel validation

获取更多详细信息

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这几行就可以解决您的问题...  您必须像这样检查图像是否存在。

私有或受保护功能规则

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

答案 4 :(得分:0)

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,

    ];
}