【问题标题】:Laravel validate array of object JSONLaravel 验证对象 JSON 数组
【发布时间】:2018-02-23 14:07:49
【问题描述】:

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

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

【问题讨论】:

  • 您需要使用密钥发送数据,然后像在上一个示例中所做的那样进行验证。这是正确的方法。

标签: arrays json api validation laravel-5


【解决方案1】:

您可以尝试通过首先执行以下操作来规避该问题:

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

那么你可以使用你建议的规则:

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

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

【讨论】:

  • 我喜欢这个解决方案,但我是 API 新手,让用户放置 'data': 数组更好还是我应该按照你的建议自己做?发送对象数组的正确方法是什么?
  • 我使用过需要在请求中发送 data 的 API,但我见过其他不需要的 API。如何实现 API 完全取决于您。如果开发人员想要使用 API,他们将在任何情况下遵循您的文档。但越容易制作,他们就越有可能使用它。
  • 找到了这个答案,看起来 Lumen 在 5.6 中正在寻找请求对象而不是数组
【解决方案2】:

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

中提琴:

发布:

{
"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' 会拒绝它们。

【讨论】:

    【解决方案3】:

    我能够在 laravel 6 中通过 App\Http\Requests CustomRequestClass 执行此操作,如下所示

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

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 2018-05-06
      • 1970-01-01
      • 2015-10-24
      • 2019-02-08
      • 1970-01-01
      • 2021-05-18
      • 2019-02-03
      • 2016-08-10
      相关资源
      最近更新 更多