簡體   English   中英

Laravel:是否可以對數組中的對象應用不同的表單驗證規則

[英]Laravel: Is it possible to apply different form validation rules to objects in an array

我有一個 Laravel 9 API。

我將以下 json 發布到端點。

{
  "shapes": [
    {
      "type": "Point",
      "coordinates": [1, 2]
    },
    {
      "type": "MultiPolygon",
      "coordinates": [
        [
          [
            [1, 2],
            [3, 4],
            [5, 6],
          ]
        ]
      ]
    }
  ]
}

我有一些表單驗證(在表單請求類中)需要驗證根據類型不同給出的坐標。

即,如果形狀的類型是點,則應用PointCoordinatesValidator規則;如果形狀的類型是多多邊形,則應用MultiPolygonCoordinatesValidator規則。

public function rules()
{
    return [
        'shapes' => 'required|array|min:1',
        'shapes.*.type' => [
            'required',
            'string',
            'in:Point,MultiPolygon',
        ],
        'shapes.*.coordinates' => [
            'required',
            request()->input('shapes.*.type') == 'Point' ?
                new PointCoordinatesValidator :
                new MultiPolygonCoordinatesValidator,
        ],
    ];
}

但是,在運行此程序時,自定義MultiPolygonCoordinatesValidator規則將應用於兩種形狀,而不僅僅是類型 == MultiPolygon 的形狀。

我可以看到request()->input('shapes.*.type')shapes.1的 Point 和shapes.0的 MultiPolygon

我對驗證的期望是否過高? 是否可以根據數組中的值以不同方式驗證數組中的不同項目?

這絕對可能的,但不是通過檢查request()->input('shapes.*.type') == 'Point' ; *是一個通配符,並沒有真正檢查每次迭代。

您可以根據輸入構建規則,但它有點反模式,如果typenull或類似類型,則可能會出現問題。

試一試:

public function rules() {
  $rules = [
    'shapes' => 'required|array|min:1',
    'shapes.*.type' => [
      'required',
      'string',
      'in:Point,MultiPolygon',
    ]
  ];

  foreach(request()->input('shapes', []) as $index => $shape) {
    $rules["shapes.{$index}.coordinates"] = [
      'required',
      $shape['type'] == 'Point' ? new PointCoordinatesValidator() : new MultiPolygonCoordinatesValidator()
    ];
  }

  return $rules;
}

使用它,你會得到這樣的東西:

[
  'shapes' => 'required|array|min:1',
  'shapes.*.type' => [
    'required',
    'string',
    'in:Point,MultiPolygon'
  ],
  'shapes.0.coordinates' => [
    'required',
    new PointCoordinatesValidator()
  ],
  'shapes.1.coordinates' => [
    'required',
    new MultiPolygonCoordinatesValidator()
  ]
  // And so on...
]

您的$rules數組可能會變得非常大,具體取決於上傳的shapes數量,但這應該允許您根據提供的type明確針對每個形狀的某些驗證規則。

只需傳入數組元素,然后在您的規則中實施類型檢查:

'shapes.*' => [
               'required',
                new CoordinatesValidator(),
              ],

然后,在規則中, $value將包含類型和坐標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM