【问题标题】:Laravel request validation image required in create but not required in update创建时需要 Laravel 请求验证图像,但更新时不需要
【发布时间】:2021-06-13 17:11:52
【问题描述】:

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

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

问题是:

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

我尝试过的:

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

【问题讨论】:

  • 创建资源时是否同时需要category_idseasons_id
  • @PeterSowah 是的,因为它们都可能会更新并且它们都是必需的

标签: php laravel laravel-validation


【解决方案1】:

使用required_without 规则

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

'image'         => 'required_without:id`

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

 'image'         => 'required_without:product_id`

您可以从laravel validation获得更多详细信息

【讨论】:

  • 你在第一行代码中写的id是什么?我了解我将与补丁请求一起发送的product_id
  • 好的,那么就使用数组中的内容。
  • 我在更新方法中有product_id,那么我如何用required_with添加它?
  • 对不起,你需要使用'required_without'
  • 问题是我在 URL 中发送product_id,除了POSTPATCH 请求之外,我没有任何东西可以区分这两个请求..
【解决方案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'),
];
    }
}

}

【讨论】:

  • 我会试试这个解决方案
  • 我在ProductRequest.php 文件中没有$request 变量..
  • request()->isMethod('put')代替$request()->isMethod('put')
【解决方案3】:
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,

    ];
}

【讨论】:

  • 您好,欢迎来到 Stack Overflow。虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-18
      • 1970-01-01
      • 2021-10-01
      • 2018-04-18
      • 2018-12-02
      • 2021-06-29
      • 2011-05-04
      • 1970-01-01
      • 2017-05-17
      相关资源
      最近更新 更多