How to make a good validation on laravel?

I have data, they look like this:

 {
   sender_name : "Real fake sender name",
   recipient_name : "Real fake recipient name",
   goods: [
     {
        "no" : 1
        "name":"Pen",
        "unit": "1",
        "qty":"50",
        "price":"50",
        "amount":"2500",
        "vat_percent":"5",
        "vat_sum": "125",
        "total_sum": "2625"
     }
   ]
 }

I need to validate "goods" using extend validator. Here is his code:

Validator::extend('invoiceGoods' , function($attribute, $value, $parameters, $validator) {

  $rulesForGoods = [
      'no'          => 'integer|required',
      'name'        => 'string|max:64|required',
      'unit'        => 'required|integer',
      'qty'         => 'required|string',
      'price'       => 'required|numeric',
      'amount'      => 'required|numeric',
      'vat_percent' => 'nullable|numeric',
      'vat_sum'     => 'nullable|numeric',
      'total_sum'   => 'required|numeric'
  ];

  foreach ($value as $good) {
      $validator = Validator::make($good , $rulesForGoods);
      if ($validator->fails()) {
          return false;
      }
  }

  return true;

});

This is the main code.

$validator = Validator::make($data , [
   'goods' => 'invoiceGoods',
   'sender_name' => 'string',
   'recipient_name' => 'string',
]);

if ($validator->fails()) {
  return response()->json([
    'success' => false,
    'message' => 'Validation error.',
    'data'    => $validator->errors()
  ]);
}

If the goods validation error occurs, I get this answer:

enter image description here

But I would like to display errors like this: the wrong unit in the goods with no 1.

I know that the third argument can be passed an array with custom messages, but how to return it from the extended validator if it should return true or false?

Upvotes: 0

Views: 42

Answers (1)

Bader
Bader

Reputation: 845

https://laravel.com/docs/5.8/validation#custom-error-messages

$messages = [
'Validation.invoice_goods' => 'Errror message!',];

$validator = Validator::make($input, $rules, $messages);

Upvotes: 1

Related Questions