Как получить список ошибок формы в нормальном виде?

110
30 января 2021, 14:00

Использую в контроллере форму унаследованную от Symfony\Component\Form\AbstractType. Хочу как-то получить список ошибок валидации. Там есть метод getErrors, но он возвращает их в каком-то очень странном виде... Итератор из объектов в которых по сути ценного только сообщение об ошибке. Понять же к какому полю оно относится никакой возможности не нашел...

P.S. Хочу получить простой массив типа ['field1' => 'error1', 'field2' => 'error2'].

Answer 1

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

public function createAction(Request $request): JsonResponse
{
    ...
    $form->submit($requestData);
    if ($form->isSubmitted() && $form->isValid()) {
        ...
    } else {
        // получаем список ошибок в виде массива
        $validateErrors = $this->getErrorMessages($form);
    } 
}
/**
 * Получение ошибок формы в виде массива 'поле' => 'строка ошибки'
 *
 * @param FormInterface $form
 *
 * @return array|string
 */
public function getErrorMessages(FormInterface $form)
{
    $arErrors = [];
    $formErrors = $form->getErrors(true, false);
    foreach ($formErrors as $formError) {
        if ($formError instanceof FormErrorIterator) {
            $subForm = $formError->getForm();
            $key = $subForm->getName();
            $subErrors = $this->getErrorSubMessages($subForm);
            $arErrors[$key] = $subErrors;
        } else {
            $key = $formError->getOrigin()->getName();
            $arErrors[$key] = $formError->getMessage();
        }
    }
    return $arErrors;
}
protected function getErrorSubMessages(FormInterface $form)
{
    $arErrors = [];
    $formErrors = $form->getErrors(true, false);
    foreach ($formErrors as $formError) {
        if ($formError instanceof FormErrorIterator) {
            $subForm = $formError->getForm();
            $key = $subForm->getName();
            $subErrors = $this->getErrorSubMessages($subForm);
            $arErrors[$key] = $subErrors;
        } else {
            return $formError->getMessage();
        }
    }
    return $arErrors;
}
Answer 2
function myArray() {
   return ['field1' => 'error1', 'field2' => 'error2'];
}
READ ALSO
Проверка тип данных <PHP>

Проверка тип данных <PHP>

У меня на PHP приходят данные, и я пока не знаю какиеЗадача понять число ли это или нет

95
Что не так с регуляркой

Что не так с регуляркой

Не работает регурялка в php может кто-то подскажет почему?:

117
Open-source проекты на Java, с наилучшей архитектурой [закрыт]

Open-source проекты на Java, с наилучшей архитектурой [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы на него можно было дать ответ, основанный на фактах и цитатах

110