लारवेल में सरणी को कैसे मान्य किया जाए?


105

मैं Laravel में सरणी POST को मान्य करने का प्रयास करता हूं:

$validator = Validator::make($request->all(), [
            "name.*" => 'required|distinct|min:3',
            "amount.*" => 'required|integer|min:1',
            "description.*" => "required|string"

        ]);

मैं पोस्ट रिक्त है और इस मिल भेजने if ($validator->fails()) {}के रूप में False। इसका मतलब है कि सत्यापन सत्य है, लेकिन ऐसा नहीं है।

लारवेल में सरणी को कैसे मान्य किया जाए? जब मैं फॉर्म जमा करता हूंinput name="name[]"

जवाबों:


239

Asterisk प्रतीक (*) का उपयोग सरणी में मानों की जांच करने के लिए किया जाता है , न कि सरणी में।

$validator = Validator::make($request->all(), [
    "names"    => "required|array|min:3",
    "names.*"  => "required|string|distinct|min:3",
]);

ऊपर के उदाहरण में:

  • "नाम" कम से कम 3 तत्वों के साथ एक सरणी होना चाहिए,
  • "नाम" सरणी में मान कम से कम 3 वर्ण लंबे होने के लिए अलग (अद्वितीय) तार होने चाहिए।

संपादित करें: लारवेल 5.5 के बाद से आप अनुरोध वस्तु पर सीधे वैध () विधि कह सकते हैं:

$data = $request->validate([
    "name"    => "required|array|min:3",
    "name.*"  => "required|string|distinct|min:3",
]);

यदि आप उपयोग कर रहे हैं तो इसे एक पकड़ने की कोशिश में रखना याद रखें $request->validate([...])। यदि डेटा सत्यापन विफल रहता है, तो एक अपवाद उठाया जाएगा।
daisura99

किसी विशिष्ट फ़ील्ड का त्रुटि संदेश कैसे प्राप्त करें? जैसे मेरे नाम के 2 क्षेत्र हैं, और फिर यह दूसरा क्षेत्र है जिसमें केवल त्रुटि है, मैं इसे कैसे प्राप्त कर सकता हूं?
ईम जी

38

मेरे पास एक HTML + Vue.js डेटा ग्रिड / तालिका से मेरे अनुरोध डेटा के रूप में यह सरणी है:

[0] => Array
    (
        [item_id] => 1
        [item_no] => 3123
        [size] => 3e
    )
[1] => Array
    (
        [item_id] => 2
        [item_no] => 7688
        [size] => 5b
    )

और इसे ठीक करने के लिए इसका उपयोग करें जो ठीक से काम करता है:

$this->validate($request, [
    '*.item_id' => 'required|integer',
    '*.item_no' => 'required|integer',
    '*.size'    => 'required|max:191',
]);

2
यह ठीक उसी प्रकार की चीज़ है जिसकी मुझे ज़रूरत थी!
क्रिस स्टेज

17

सत्यापन और प्राधिकरण तर्क लिखने का अनुशंसित तरीका उस तर्क को अलग-अलग अनुरोध कक्षाओं में रखना है। इस तरह आपका कंट्रोलर कोड साफ रहेगा।

आप निष्पादित करके अनुरोध वर्ग बना सकते हैं php artisan make:request SomeRequest

प्रत्येक अनुरोध में कक्षा की rules()विधि आपके सत्यापन नियमों को परिभाषित करती है:

//SomeRequest.php
public function rules()
{
   return [
    "name"    => [
          'required',
          'array', // input must be an array
          'min:3'  // there must be three members in the array
    ],
    "name.*"  => [
          'required',
          'string',   // input must be of type string
          'distinct', // members of the array must be unique
          'min:3'     // each string must have min 3 chars
    ]
  ];
}

अपने कंट्रोलर में अपने रूट फंक्शन को इस तरह लिखें:

// SomeController.php
public function store(SomeRequest $request) 
{
  // Request is already validated before reaching this point.
  // Your controller logic goes here.
}

public function update(SomeRequest $request)
{
  // It isn't uncommon for the same validation to be required
  // in multiple places in the same controller. A request class
  // can be beneficial in this way.
}

प्रत्येक अनुरोध वर्ग प्री-और पोस्ट-वेकेशन हुक / विधियों के साथ आता है, जिन्हें व्यावसायिक तर्क और विशेष मामलों के आधार पर अनुकूलित किया जा सकता है ताकि अनुरोध वर्ग के सामान्य व्यवहार को संशोधित किया जा सके।

आप समान प्रकार के अनुरोधों (जैसे ) webऔर अनुरोधों के लिए माता-पिता अनुरोध कक्षाएं बना सकते हैं apiऔर फिर इन मूल कक्षाओं में कुछ सामान्य अनुरोध तर्क संलग्न कर सकते हैं।


6

थोड़ा और अधिक जटिल डेटा, @ लारन और @ निसल गनवर्दाना के उत्तरों का मिश्रण

[ 
   {  
       "foodItemsList":[
    {
       "id":7,
       "price":240,
       "quantity":1
                },
               { 
                "id":8,
                "quantity":1
               }],
        "price":340,
        "customer_id":1
   },
   {   
      "foodItemsList":[
    {
       "id":7,
       "quantity":1
    },
    { 
        "id":8,
        "quantity":1
    }],
    "customer_id":2
   }
]

सत्यापन नियम होगा

 return [
            '*.customer_id' => 'required|numeric|exists:customers,id',
            '*.foodItemsList.*.id' => 'required|exists:food_items,id',
            '*.foodItemsList.*.quantity' => 'required|numeric',
        ];

4

आपको इनपुट ऐरे पर लूप करना होगा और यहां वर्णित प्रत्येक इनपुट के लिए नियम जोड़ना होगा: लूप ओवर रूल्स

यहाँ हाँ के लिए कुछ कोड है:

$input = Request::all();
$rules = [];

foreach($input['name'] as $key => $val)
{
    $rules['name.'.$key] = 'required|distinct|min:3';
}

$rules['amount'] = 'required|integer|min:1';
$rules['description'] = 'required|string';

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

//Now check validation:
if ($validator->fails()) 
{ 
  /* do something */ 
}

9
ऐसा करने की कोई आवश्यकता नहीं है - laravel.com/docs/5.4/validation#validating-arrays
फिलिप
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.