У меня есть запрос, в котором я передаю массив объектов JSON. Он имеет следующую структуру
[ {path: 'string', class: 'string'} ]
Насколько я понимаю, нет простого способа проверить этот массив, поэтому я попробовал следующий
$validatedData = $request->validated();
$result = ['data' => []];
foreach ($validatedData['items'] as $item) {
$result['data'][] = json_decode($item);
}
Validator::make($result, [
'data.*.path' => 'required|url',
'data.*.class' => 'required|string'
])->validate();
Однако это приводит к
array(1) {
["data"]=>
array(2) {
[0]=>
object(stdClass)#813 (2) {
["link"]=>
NULL
["class"]=>
NULL
}
[1]=>
object(stdClass)#814 (2) {
["link"]=>
NULL
["class"]=>
NULL
}
}
}
Как-то валидатор обрезает данные. Когда я пробую без части Validator::make, она работает нормально, однако мне нужно контролировать, что я получаю.
Почему бы вам не проверить ввод JSON? Я немного запутался в вашей проблеме и в том, почему вам нужно декодировать JSON и для начала создать массив результатов. Вы отправляете JSON в запросе, отличном от json?
Я отправляю FormData с полем JSON.stringifyed. Это поле содержит массив. Поскольку это JSON, PHP рассматривает его как строку, поэтому я вынужден искать обходные пути
Какая-то конкретная причина? Почему бы просто не отправить json-запрос?
У вас есть массив объектов, поскольку json_decode возвращает объект. Чтобы он возвращал ассоциативный массив, нужно сделать json_decode($item, true). Попробуйте и посмотрите, работает ли это.
Потому что я нужно для отправки FormData. Он содержит файл.
@ JoséA.Zapata ну .. Это как-то сработало. Однако мне любопытно, почему он не работал с массивом объектов
Кажется разумным, поскольку объекты stdclass никогда не будут существовать в запросе.
@ JoséA.Zapata, пожалуйста, опубликуйте свой ответ Я отмечу это. Если возможно, расширьте свое объяснение для тех, кто впервые столкнулся с той же проблемой.






У вас есть массив объектов, поскольку json_decode возвращает объект. Чтобы он возвращал ассоциативный массив, нужно сделать json_decode($item, true). Вам нужно сделать это, потому что валидатору Laravel нужны как данные, так и правила проверки, которые должны быть массивами. Поскольку вы передавали массив объектов, это не сработало.
попробуй поставить
$result = [];