Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Laravel验证对象JSON的数组_Arrays_Json_Api_Validation_Laravel 5 - Fatal编程技术网

Arrays Laravel验证对象JSON的数组

Arrays Laravel验证对象JSON的数组,arrays,json,api,validation,laravel-5,Arrays,Json,Api,Validation,Laravel 5,我在我的Laravel5.5API上有一个POST端点,我使用postman来测试我的路线,问题就在这里。 我想发送一个相同类型对象的数组,如下所示: [ { "name":"test", "tag":"TEST" }, { "name":"test2", "tag":"TEST_2" } ]

我在我的Laravel5.5API上有一个POST端点,我使用postman来测试我的路线,问题就在这里。 我想发送一个相同类型对象的数组,如下所示:

[
  { 
   "name":"test",
   "tag":"TEST"
  },
  {
   "name":"test2",
   "tag":"TEST_2"
  }
]
但我无法正确地验证它

在我的控制器中,我有:

$validator = Validator::make($requests->all(), [
 
   'name' => 'required|string',
   'tag' => 'required|string'
]);

if($validator->fails()) 
   //Warn user for errors 
我也试过简单的方法

$this->validate($requests->all() .... )
我尝试用
'.name'
'*.name'
重命名规则,但没有成功

我尝试用
$request->input()
替换
$request->all()
,但没有成功

我也试着循环,但我得到了例外

foreach($request as $req){

  $validator = Validator::make($req ....) 

  //rest of the code
}
另一方面,我可以像这样检索数据
$datas=$request->all()
,并存储它们,但没有验证

唯一可行的解决方案是命名我的阵列:

{
 "data" : [
      { 
       "name":"test",
       "tag":"TEST"
      },
      {
       "name":"test2",
       "tag":"TEST_2"
      }
    ]
}
然后用
'data.*.name'
命名规则,但这要求API用户解析数组。 假设我有一个要存储的数组
$array
,我需要这样做

$arrayParsed = ['data' => $array]
并使用
$arrayParsed
调用API,我认为这有点多余


有没有更好的方法来处理此问题?

您可以尝试通过以下方法来规避此问题:

$data = [ 'data' => $requests->all() ];
然后,您可以使用您建议的规则:

$validator = Validator::make($data, [
   'data.*.name' => 'required|string',
   'data.*.' => 'required|string'
]);

虽然不是最优雅的解决方案,但它解决了您的问题…

如果您发布了一个数组,则批准的答案是有效的,但是,为了更进一步,我需要保存多个数组。虽然如果我创建两个独立的端点,这种方法会起作用,但如果我想将所有内容保存在一个
DB::transaction
中,该怎么办

中提琴:

职位:

服务器:

$this->validate($request, [
    'array1' => 'present|array',
    'array2' => 'present|array',
    'array1.*.key1' => 'required|string',
    'array1.*.key2' => 'required|integer',
    'array2.*.key3' => 'required|string',
    'array2.*.key4' => 'required|integer'
]);

DB::transaction(function() use($request) {
    foreach($request['array1'] as $x){
        ...do stuff here
    };
});

注意:
'present | array'
接受空数组,而
'required | array'
将拒绝空数组。

我可以通过App\Http\Requests CustomRequestClass在laravel 6中这样做

public function rules()
{
    return [
        '*.name' => 'required',
        '*.tag' => 'required'
    ];
}

您需要使用密钥发送数据,然后像在上一个示例中所做的那样进行验证。这是正确的方法。我喜欢这个解决方案,但我对API不熟悉,让用户放置“数据”:数组更好吗?还是我应该按照您的建议自己做?发送对象数组的正确方法是什么?我使用过需要在请求中发送
数据的API,也见过其他不需要的API。如何实现这些API实际上取决于您。如果开发人员想要使用API,他们在任何情况下都会遵循您的文档。但是越容易制作,他们就越有可能使用它。找到这个答案,看起来Lumen正在寻找请求对象,而不是现在5.6中的数组
public function rules()
{
    return [
        '*.name' => 'required',
        '*.tag' => 'required'
    ];
}