Как получить этот полный путь к свойствам? Это нужно для добавления случаев проверки в jQuery, потому что я переписал устаревшее приложение в новое приложение SF4. Odx2ParameterCollectionType — это коллекция с динамическими полями.
Есть ли способ получить эти ошибки проверки? Может у Вас есть другие решения как с этим работать?
protected function renderFormErrors(FormInterface $form): JsonResponse
{
$errors = [];
foreach ($form->getErrors(true) as $error) {
$errors[$error->getOrigin()->getName()] = $error->getMessage();
}
return $this->json([
self::RETURN_PARAMETER_STATUS => Response::HTTP_INTERNAL_SERVER_ERROR,
self::RETURN_PARAMETER_ERRORS => $errors
]);
}
Действительный:
{
"status": 500,
"errors": {
"udsId": "This value should not be blank."
}
}
Ожидал:
{
"status": 500,
"errors": {
"Odx2ParameterCollectionType[parameters][5][udsId]": "This value should not be blank."
}
}
Обновлено:
Хорошо, я разобрался, но пока мне не хватает одного - индекса коллекции, это мой код:
foreach ($form->all() as $name => $child) {
if (!$child->isValid()) {
foreach ($child->getErrors(true) as $error) {
$errors[(string) $form->getPropertyPath()][$name][$error->getOrigin()->getName()] = $error->getMessage();
}
}
}
https://symfonycasts.com/screencast/symfony-rest2/api-проблемный-класс В этом курсе вы сможете создать собственное исключение ApiException и модель для проблем и других полезных...
Но если вы хотите получить только фактический путь для вашего недопустимого поля и сообщения, вы можете сделать это следующим образом.
<?php
namespace App\Form\Validation;
use Symfony\Component\Form\FormInterface;
class ValidateForm
{
static function renderFormErrors(FormInterface $form)
{
$errorModel = new FormValidation();
foreach ($form->getErrors(true) as $error)
{
$path = $error->getCause()->getPropertyPath();
if (empty($path)) {
break;
}
$path = preg_replace("/^(data.)|(.data)|(\\])|(\\[)|children/", '', $path);
$message = $error->getCause()->getMessage();
$errorModel->errors[$path] = $message;
}
return $errorModel; // or convert to json and return.
}
}
class FormValidation
{
public $message = "Validation Error";
public $errors = [];
}
const REGEX_EXPLODE_COLLECTION_PATH = "/^(data.)|(.data)|(\\])|(\\[)|children/";
$errors = [];
foreach ($form->all() as $name => $child) {
if (!$child->isValid()) {
foreach ($child->getErrors(true) as $error) {
$propertyPath = $error->getCause()->getPropertyPath();
$path = preg_replace(self::REGEX_EXPLODE_COLLECTION_PATH, '', $propertyPath);
list($collection, $index, $field) = explode('.', $path);
$errors[(string) $form->getPropertyPath()][$collection][$index][$field] = $error->getMessage();
}
}
}
Спасибо, Наири Абгарян, это мое решение, которое отлично работает для меня :-)