用参数验证嵌套JSON



我正在尝试验证Laravel中嵌套的JSON对象。我已经创建了一个自定义规则来做到这一点,但我有一个问题,目前,我希望能够传递当前数组索引的对象到我的自定义验证器:

<?php
namespace AppHttpRequestsApp;
use AppRulesCheckoutDepatureCheck;
use AppRulesSeatIsAvailable;
use IlluminateFoundationHttpFormRequest;
class CheckoutRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
"company" => "required",
"seats" => "required|array",
"seats.*.seat_no" => ['required', new SeatIsAvailable()], // would like to pass seat.* to the constructor of my custom validator here
"seats.*.schedule_id" => "required|numeric",
"seats.*.date" => "required|date"
];
}
}

关键是我的自定义验证器需要schedule_id和data以及seat_no来成功验证请求。

我如何在Laravel中做到这一点?

您可以根据座位数组输入的长度动态添加规则

<?php
namespace AppHttpRequestsApp;
use AppRulesCheckoutDepatureCheck;
use AppRulesSeatIsAvailable;
use IlluminateFoundationHttpFormRequest;
class CheckoutRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = [
'company' => 'required',
'seats' => 'required|array',
];
return array_merge($rules, $this->seatsRules());
}
private function seatsRules(): array
{
$rules = [];
foreach ((array) $this->request->get('seats') as $key => $seat) {
$rules["seats.$key.seat_no"] = ['required', new SeatIsAvailable($seat)];
$rules["seats.$key.schedule_id"] = 'required|numeric';
$rules["seats.$key.date"] = 'required|date';
}
return $rules;
}
}