【问题标题】:Laravel validate dynamically added input with custom messagesLaravel 使用自定义消息验证动态添加的输入
【发布时间】:2019-04-21 09:29:29
【问题描述】:

我正在使用 laravel 开发库存系统。

在我遇到表单验证问题之前,一切都按预期进行。

所以下面是我在订单控制器代码中的插入函数,

public function insert(Request $request) {
    // Save data to "orders" table
    $orderer = [
      'orderId' => $request->get('orderId'),
      'customerId' => $request->get('customerId'),
      'orderTotal' => $request->get('orderTotal'),
      'paymentMethodId' => $request->get('paymentMethodId'),
      'orderStatusId' => $request->get('orderStatusId'),
      'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
      'updated_at' => \Carbon\Carbon::now()  # \Datetime()
    ];

    // Looping on dynamic "New Added" input field
    $orderedItems_Sku = $request->get('productSku');
    foreach($orderedItems_Sku as $key => $v)
    {
      $productSku = $request->get('productSku') [$key];
      $product = \App\Product::find($productSku);
      $rules = [
              'orderId' => 'unique:orders',
              'customerId' => 'required',
              'orderStatusId' => 'required',
              'paymentMethodId' => 'required',
              'uomId.*' => 'required',
              'productSku.*' => 'required',
              'productQty.*' => 'required',
              // 'lte' means Less Than or Equal to available stock quantity
              'orderQty.*' => 
              'required|numeric|min:1|lte:'.$product['productQty'],
              'orderPrice.*' => 'required'
          ];

      $messages = [
                'customerId.required' => 'Please select Customer',
                'orderStatusId.required' => 'Please select Order Status',
                'paymentMethodId.required' => 'Please select Payment Method',
                'uomId.*.required' => 'Please select UOM',
                'productSku.*.required' => 'Please select Product',
                'orderQty.*.required' => 'Please enter Order Quantity',
                'orderQty.*.min' => 'Quantity must be at least 1',
                'orderQty.*.lte' => 'Quantity of product no. 
                '.$product['productSku'].' must be not greater than 
                '.$product['productQty'],
                'orderPrice.*.required' => 'Please enter Product Price'
          ];

      // Validate "Rules" and "Messages" to running.
      $this->validate($request, $rules, $messages); 

      $data = [
        'orderId' => $request->get('orderId'),
        'productSku' => $v,
        'orderQty' => $request->get('orderQty') [$key],
        'uomId' => $request->get('uomId'),
        'orderPrice' => $request->get('orderPrice') [$key],
        'orderDiscount' => $request->get('orderDis') [$key],
        'orderPerAmount' => $request->get('orderPerAmount') [$key],
        'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
        'updated_at' => \Carbon\Carbon::now()  # \Datetime()
      ];
      \App\orderedItem::insert($data);
      // "Decrement" means, product quantity will be deducted based on how 
      much quantity that customer has ordered.
      \App\Product::where("productSku", $v)->decrement("productQty", 
      $request->orderQty [$key]);
    }
    \App\Order::insert($orderer);
    return redirect('orders')->with('success', 'Order Successfully Added!'); 
  }

这是我在 create.blade.php 中的 html 代码,

https://pastebin.com/cn2X1aVL

如您所见,有“orderQty”和“productQty”字段。

因此,我尝试使用动态“productQty”字段验证动态“orderQty”字段,以防止用户在“productQty”字段中输入大于值的数量。

根据大多数 laravel 社区的建议,我还在我的代码中的 $rules 数组中使用 lte(小于等于)命令。

这个东西只适用于单个输入,但不适用于动态添加的输入。参考下图,您可以看到,产品的第二个输入没有按照我的意愿正确验证。

create blade file

即使是错误消息也没有按需要显示动态消息。

请帮我找出问题所在。我尝试了很多解决方案,但仍然无法正常工作。 :'(

【问题讨论】:

  • 您能否发布您的“orderQty”和“productQty”的html字段
  • 试试这个:'orderQty.*' => 'required|numeric|min:1|max:'.$product['productQty']
  • 尝试制定自定义验证规则。他们你会得到数组参数。你可以制定自己的规则。
  • 我同意自定义规则验证。
  • @JesusErwinSuarez 我已经更新了我的 html 代码。

标签: php laravel


【解决方案1】:

在测试了回答者建议的所有可能解决方案后,

现在修复了!

这是我在 OrderController 中的插入函数代码,

public function insert(OrderRequest $request) {
    // Save data to "orders" table
    $orderer = [
      'orderId' => $request->get('orderId'),
      'customerId' => $request->get('customerId'),
      'orderTotal' => $request->get('orderTotal'),
      'paymentMethodId' => $request->get('paymentMethodId'),
      'orderStatusId' => $request->get('orderStatusId'),
      'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
      'updated_at' => \Carbon\Carbon::now()  # \Datetime()
    ];

    // Looping on dynamic "New Added" input field
    $orderedItems_Sku = $request->get('productSku');
    foreach($orderedItems_Sku as $key => $v)
    {

      $data = [
        'orderId' => $request->get('orderId'),
        'productSku' => $v,
        'orderQty' => $request->get('orderQty') [$key],
        'uomId' => $request->get('uomId'),
        'orderPrice' => $request->get('orderPrice') [$key],
        'orderDiscount' => $request->get('orderDis') [$key],
        'orderPerAmount' => $request->get('orderPerAmount') [$key],
        'created_at' =>  \Carbon\Carbon::now(), # \Datetime()
        'updated_at' => \Carbon\Carbon::now()  # \Datetime()
      ];
      \App\orderedItem::insert($data);
      // "Decrement" means, product quantity will be deducted based on how much quantity that customer has ordered.
      \App\Product::where("productSku", $v)->decrement("productQty", $request->orderQty [$key]);
    }
    \App\Order::insert($orderer);

    $validated = $request->validated();
    return redirect('orders')->with('success', 'Order Successfully Added!'); 
}

这是我在 OrderRequest 中的代码

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Http\Request;

class OrderRequest extends FormRequest
{
/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{ 
    $rules = [
        'name' => 'required',
    ];

    foreach($this->request->get('productSku') as $key => $val)
    {
        $product = \App\Product::find($val);
        $rules['orderId'] = 'unique:orders'; 
        $rules['customerId'] = 'required';
        $rules['orderStatusId'] = 'required';
        $rules['paymentMethodId'] = 'required';
        $rules['uomId'] = 'required';
        $rules['productSku.'.$key] = 'required';
        $rules['orderQty.'.$key] = 'required|numeric|min:1|lte:'.$product['productQty'];
        $rules['orderPrice.'.$key] = 'required';
    }
    return $rules;
}

public function messages() 
{
    $messages = [];
      foreach($this->request->get('productSku') as $key => $val)
      {
        $product = \App\Product::find($val);
        $messages['orderQty.'.$key.'.lte'] = 'Quantity of product no. 
'.$product['productSku'].' must be not greater than '.$product['productQty'];
      }
      return $messages;
}
}

如您所见,我创建了自己的请求文件 (OrderRequest) 并从 OrderController 调用它。

在 OrderRequest 文件中,我创建了一个 foreach 循环,以确保验证适用于我的动态字段,包​​括其中的 lte/gte 规则。

对于自定义消息,我还制作了一个 foreach 循环,因为我想动态显示错误,如下所示(参考图片),

create blade file

感谢大家向我提出各种可能的解决方案来解决这个问题。 :D

【讨论】:

    【解决方案2】:

    试试这个

    'orderQty.*' => 'required|numeric|min:1|max:'.$product['productQty'] 
    

    【讨论】:

    • 使用 lte 或 min, max 的验证工作正常。问题出在动态添加的字段上。其中 lte 规则仅适用于第一个字段,而不适用于第二个字段,第三个字段,依此类推。你可以参考我帖子中的图片。
    • @Jesus 这已经在下面答案的 cmets 中提出了
    • 我想知道为什么它不起作用,但它应该适用于 max 或 lte 规则。
    【解决方案3】:

    您可以创建自己的请求:

    php artisan make:request {请求名称}

    然后您可以像这些文档中显示的默认请求一样使用此请求

    https://laravel.com/docs/5.7/requests

    如果您添加另一个名为“消息”的方法,您可以添加这样的消息:

    public function messages() {
        return [
            '{variable name}.{validation method}' => '{message to user}'
        ]
    }
    

    然后你会得到一个带有错误信息的 ajax 响应。

    希望有帮助

    更新

    上述建议是最佳实践,因为您通过空白请求传递所有数据

    改变:

    'required|numeric|min:1|lte:'.$product['productQty'],
    

    收件人:

    'required|numeric|min:1|lte:productQty',
    

    这告诉验证器 orderQty 必须小于或等于 productQty 的输入

    【讨论】:

    • 问题不在于他无法进行请求验证。他的问题是在动态输入字段中验证大于或等于
    • 请查看更新后的回复。在我开始回复后,您编辑了问题的详细信息。
    • @EmtiazZahid 是的。我的问题是关于动态输入字段的 gte、lte 验证。不是请求问题。
    • @Josh 根据您更新的答案,现在我面临错误,“比较中的值必须属于同一类型”
    • @Josh productQty 不是输入字段值。它的价值来自 DB。
    猜你喜欢
    • 2017-05-30
    • 2014-05-31
    • 2017-06-28
    • 2017-12-13
    • 2017-12-06
    • 2017-01-08
    • 2020-07-18
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多