Laravel使用自定义消息验证动态添加的输入 [英] Laravel validate dynamically added input with custom messages

查看:39
本文介绍了Laravel使用自定义消息验证动态添加的输入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

一切都按预期进行,直到即时表单验证出现问题.

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

 公共功能insert(Request $ request){//将数据保存到订单"表$ 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()];//在动态新添加的"输入字段上循环$ 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'=>'必需的','orderStatusId'=>'必需的','paymentMethodId'=>'必需的','uomId.*'=>'必需的','productSku.*'=>'必需的','productQty.*'=>'必需的',//'lte'表示小于或等于可用库存数量'orderQty.*'=>'required |数字| min:1 | lte:'.$ product ['productQty'],'orderPrice.*'=>'必需的'];$ messages = ['customerId.required'=>请选择客户",'orderStatusId.required'=>请选择订单状态",'paymentMethodId.required'=>请选择付款方式",'uomId.*.required'=>请选择UOM",'productSku.*.required'=>请选择产品",'orderQty.*.required'=>请输入订单数量",'orderQty.*.min'=>数量必须至少为1",'orderQty.*.lte'=>'产品数量'.$ product ['productSku']."不得大于'.$ product ['productQty'],'orderPrice.*.required'=>'请输入产品价格'];//验证规则"和消息"是否正在运行.$ 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);//减量"表示将根据以下方式扣除产品数量客户订购的数量很多.\ App \ Product :: where("productSku",$ v)->减量("productQty",$ request-> orderQty [$ key]);}\ App \ Order :: insert($ orderer);返回redirect('orders')-> with('success','成功添加订单!');} 

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

https://pastebin.com/cn2X1aVL

如您所见,有"orderQty"和"productQty"字段.

因此,我试图通过动态"productQty"字段验证动态"orderQty"字段,以防止用户在"productQty"字段中输入大于值的数量.

我还按照大多数laravel社区的建议,在我的代码的$ rules数组内使用了lte(小于等于)命令.

这件事仅对单个输入有效,而对动态添加的输入无效.请参阅下面的图片,您可以看到,该产品的第二个输入未按我想要的方式正确验证.

创建刀片文件

甚至错误消息未按要求显示动态消息.

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

解决方案

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

现在固定了!

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

 公共功能insert(OrderRequest $ request){//将数据保存到订单"表$ 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()];//在动态新添加的"输入字段上循环$ 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);//减量"表示将根据客户订购的数量扣除产品数量.\ App \ Product :: where("productSku",$ v)-> decrement("productQty",$ request-&> orderQty [$ key]);}\ App \ Order :: insert($ orderer);$ validated = $ request-> validated();返回redirect('orders')-> with('success','成功添加订单!');} 

这是我在OrderRequest中的代码

 <?php命名空间App \ Http \ Requests;使用Illuminate \ Foundation \ Http \ FormRequest;使用Illuminate \ Http \ Request;OrderRequest类扩展FormRequest{/***确定用户是否有权发出此请求.** @返回布尔*/公共功能authorize(){返回true;}/***获取适用于该请求的验证规则.** @返回数组*/公共职能规则(){$ rules = ['名称'=>'必需的',];foreach($ this-> request-> get('productSku')as $ key => $ val){$ product = \ App \ Product :: find($ val);$ rules ['orderId'] ='unique:orders';$ rules ['customerId'] ='必填';$ rules ['orderStatusId'] ='必需';$ rules ['paymentMethodId'] ='必填';$ rules ['uomId']​​ ='必填';$ rules ['productSku.'.$ key] ='必需';$ rules ['orderQty.'.$ key] ='required |数字| min:1 | lte:'.$ product ['productQty'];$ rules ['orderPrice.'.$ key] ='必需';}返还$ rules;}公共功能message(){$ messages = [];foreach($ this-> request-> get('productSku')as $ key => $ val){$ product = \ App \ Product :: find($ val);$ messages ['orderQty.'.$ key.'.lte'] ='产品数量'.$ product ['productSku']."不得大于'.$ product ['productQty'];}返回$ messages;}} 

如您所见,我已经创建了自己的请求文件(OrderRequest),并从OrderController对其进行调用.

在OrderRequest文件中,我进行了一个foreach循环,以确保验证可在我的动态字段(包括lte/gte规则)中使用.

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

创建刀片文件

感谢所有向我建议各种解决方案的人.:D

Im developing inventory system using laravel.

Everything were going as expected until im facing a problem on form validation.

So below is my insert function in my order controller code,

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

Here's is my html code inside create.blade.php,

https://pastebin.com/cn2X1aVL

as you can see, there's "orderQty" and "productQty" field.

So, im trying to validate the dynamic "orderQty" field with the dynamic "productQty" field to prevent user from entering quantity greater than value inside "productQty" field.

im also using lte (less than equal to) command inside $rules array in my code as per recommended by most of laravel communities.

This thing only works perfectly on single input but not on dynamically added input. Refer to the image below, you can see, the second input of the product not validated properly as i wanted.

create blade file

even the error messages not showing the dynamic message as wanted.

Please help me to find out what is the problem. I have trying so many solutions but still not working. :'(

解决方案

After testing all possible solutions suggested by answerers,

Now its fixed!

Here's my insert function code in 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!'); 
}

and this is my code inside 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;
}
}

As you can see, i've created my own Request file (OrderRequest) and call it from OrderController.

Inside the OrderRequest file, i've made a foreach loop to make sure the validation works on my dynamic field including lte/gte rules in it.

For custom messages, i've also made a foreach loop as i wanted to show the error dynamically as below (refer image),

create blade file

Thank you everyone who suggests me various possible solutions to me to fix this problem. :D

这篇关于Laravel使用自定义消息验证动态添加的输入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆