我有一個 Laravel 9 API。
我將以下 json 發布到端點。
{
"shapes": [
{
"type": "Point",
"coordinates": [1, 2]
},
{
"type": "MultiPolygon",
"coordinates": [
[
[
[1, 2],
[3, 4],
[5, 6],
]
]
]
}
]
}
我有一些表單驗證(在表單請求類中),需要根據型別驗證不同的坐標。
即,PointCoordinatesValidator如果形狀的型別是Point,則應用MultiPolygonCoordinatesValidator規則;如果形狀的型別是MultiPolygon,則應用規則。
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')是 Point forshapes.0和 MultiPolygon forshapes.1
我是否對驗證期望過高?是否可以根據該陣列中的值以不同的方式驗證陣列中的不同專案?
uj5u.com熱心網友回復:
這絕對是可能的,但不是通過檢查request()->input('shapes.*.type') == 'Point';那*是一個通配符,并且在每次迭代時都沒有真正檢查。
您可以從輸入構造規則,但這有點反模式,如果typeisnull或類似情況可能會出現問題。
試一試:
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提供的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/513397.html
