[英]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'
; *
是一個通配符,並沒有真正檢查每次迭代。
您可以根據輸入構建規則,但它有點反模式,如果type
為null
或類似類型,則可能會出現問題。
試一試:
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.