首页 > 解决方案 > 使用参数验证 Nest JSON

问题描述

我正在尝试验证 Laravel 中的嵌套 JSON 对象。我已经创建了一个自定义规则来执行此操作,但是我目前有一个问题,我希望能够将当前数组索引处的对象传递给我的自定义验证器:

<?php

namespace App\Http\Requests\App;

use App\Rules\CheckoutDepatureCheck;
use App\Rules\SeatIsAvailable;
use Illuminate\Foundation\Http\FormRequest;

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 中做到这一点?

标签: laravelvalidation

解决方案


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

<?php

namespace App\Http\Requests\App;

use App\Rules\CheckoutDepatureCheck;
use App\Rules\SeatIsAvailable;
use Illuminate\Foundation\Http\FormRequest;

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;
    }
}

推荐阅读