Laravel验证对象json的数组

时间:2017-09-14 14:23:54

标签: arrays json api validation laravel-5

我的Laravel 5.5 API上有一个POST端点,我使用邮递员测试我的路线,这就是问题所在。 我想发送一个相同类型的对象数组,如下所示:

[
  { 
   "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->all()替换$request->input()但没有成功。

我也尝试过循环但是我得到了异常

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,我认为这有点多余。

有没有更好的方法来解决这个问题?

3 个答案:

答案 0 :(得分:9)

您可以先尝试解决问题:

$data = [ 'data' => $requests->all() ];

然后你可以使用你建议的规则:

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

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

答案 1 :(得分:3)

我能够在laravel 6中通过App \ Http \ Requests CustomRequestClass进行以下操作

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

答案 2 :(得分:0)

如果您发布一个数组,则可以使用批准的答案,但是,要进一步进行操作,我需要保存多个数组。如果我创建两个端点,则该方法可行,但如果要将所有内容保存在一个DB::transaction中怎么办?

中提琴:

POST:

{
"array1": [
    { "key1": "string", "key2": 1 },
    { "key1": "string", key2": 0 }
  ],
"array2": [
    { "key3": "string", "key4": 1 },
    { "key3": "string", "key4": 0 }
  ]
}

服务器:

$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'拒绝它们。