Как получить полный путь к свойствам для FormError

Как получить этот полный путь к свойствам? Это нужно для добавления случаев проверки в 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();
            }
        }
    }
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
669
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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();
            }
        }
    }

Спасибо, Наири Абгарян, это мое решение, которое отлично работает для меня :-)

Другие вопросы по теме