Как получить полный propertyPath для FormError - PullRequest
0 голосов
/ 21 мая 2019

Как получить этот полный propertyPath? Это нужно для добавления случаев проверки в 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."
  }
}

EDIT:

Хорошо, я понял это, но пока у меня есть одна недостающая вещь - индекс сбора, это мой код:

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

Ответы [ 2 ]

0 голосов
/ 21 мая 2019
    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();
            }
        }
    }

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

0 голосов
/ 21 мая 2019

https://symfonycasts.com/screencast/symfony-rest2/api-problem-class В этом курсе вы можете создать свои собственные ApiException и Model для проблем и более полезные ...

Но если вы хотите получить только фактический путь для вашего недопустимого поля и сообщить вам,может сделать это так.

<?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 = [];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...