Symfony2: Як отримати помилки перевірки форми після прив’язки запиту до форми


110

Ось мій saveActionкод (де форма передає дані)

public function saveAction()
{
    $user = OBUser();

    $form = $this->createForm(new OBUserType(), $user);

    if ($this->request->getMethod() == 'POST')
    {
        $form->bindRequest($this->request);
        if ($form->isValid())
            return $this->redirect($this->generateUrl('success_page'));
        else
            return $this->redirect($this->generateUrl('registration_form'));
    } else
        return new Response();
}

Моє запитання: як я можу отримати помилки, якщо $form->isValid()повертається false?

Відповіді:


117

У вас є два можливих способи:

  • не переадресовувати користувача після помилки та відображати {{ form_errors(form) }}у файлі шаблону
  • масив помилок доступу як $form->getErrors()

22
Я зробив друге, що ви запропонували, але form-> getErrors () повертає порожній масив.
путівник

2
Я також зробив перший (w / php шаблони <? Php echo $ view ['form'] -> помилки ($ form)?>), Але все одно він порожній!
putolaruan

59
@mives Ви повинні встановити error_bubblingзначення true у своєму форматі, чітко встановивши параметр для кожного поля.
kgilden

5
Якщо ви використовуєте власні валідатори, Symfony не повертає помилки, згенеровані тими валідаторами, у $ form-> getErrors ().
Джей Шет

13
Ви також $form->getErrors(true)можете включити помилки дитячих форм
Кріс,

103

Symfony 2.3 / 2.4:

Ця функція отримує всі помилки. Форми на зразок "Маркер CSRF недійсний. Будь ласка, спробуйте повторно надіслати форму." а також додаткові помилки у формі дітей, які не мають помилок.

private function getErrorMessages(\Symfony\Component\Form\Form $form) {
    $errors = array();

    foreach ($form->getErrors() as $key => $error) {
        if ($form->isRoot()) {
            $errors['#'][] = $error->getMessage();
        } else {
            $errors[] = $error->getMessage();
        }
    }

    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $errors[$child->getName()] = $this->getErrorMessages($child);
        }
    }

    return $errors;
}

Щоб отримати всі помилки як рядок:

$string = var_export($this->getErrorMessages($form), true);

Symfony 2.5 / 3.0:

$string = (string) $form->getErrors(true, false);

Документи:
https://github.com/symfony/symfony/blob/master/UPGRADE-2.5.md#form https://github.com/symfony/symfony/blob/master/UPGRADE-3.0.md#form (у дно: The method Form::getErrorsAsString() was removed)


1
Це виглядає як найбільш правильна відповідь для поточного Symfony 2.4.
Слава Фомін II

@Flip Це прекрасно працює на 2.5
iarroyo

1
Чудова відповідь, АЛЕ $errors[$child->getName()] = $this->getErrorMessages($child);було киданням винятку, оскільки в компоненті Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller не було в getErrorMessages . Тож я замінив його на$form_errors[$child->getName()] = $child->getErrorsAsString();
Ахад Алі

3
@AhadAli - це рекурсивна функція, тому коли ви помістите фрагмент коду в клас, де вам потрібна ця функціональність, він зможе викликати себе. Ваше "виправлення" не дозволить вам дістатися до вкладених форм. Він працював для інших 37 людей, він також повинен працювати для вас;)
Переверніть

@Flip Ах вибачте, погано, я тільки дивився на, $this->getErrorMessages()і я думав, що його викликали безпосередньо всередині контролера та частини Symfony api.
Ахад Алі

47

Нижче наведено рішення, яке працювало на мене. Ця функція знаходиться в контролері і повертає структурований масив усіх повідомлень про помилки та поля, яке їх викликало.

Symfony 2.0:

private function getErrorMessages(\Symfony\Component\Form\Form $form) {
    $errors = array();
    foreach ($form->getErrors() as $key => $error) {
        $template = $error->getMessageTemplate();
        $parameters = $error->getMessageParameters();

        foreach($parameters as $var => $value){
            $template = str_replace($var, $value, $template);
        }

        $errors[$key] = $template;
    }
    if ($form->hasChildren()) {
        foreach ($form->getChildren() as $child) {
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    }

    return $errors;
}

Symfony 2.1 і новіші:

private function getErrorMessages(\Symfony\Component\Form\Form $form) {      
    $errors = array();

    if ($form->hasChildren()) {
        foreach ($form->getChildren() as $child) {
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    } else {
        foreach ($form->getErrors() as $key => $error) {
            $errors[] = $error->getMessage();
        }   
    }

    return $errors;
}

5
Покращено gist.github.com/2011671, але все одно не те, що я хочу. Я хочу, щоб ключі масиву були іменами полів, але вони не є.
умпірський

9
@SalmanPK Twig ніде не вказано у наведеному вище коді. Я не вірю, що я розумію ваш коментар.
Icode4food

1
Ось виправлення попереднього суті, це працює під Symfony 2.1.7. gist.github.com/WishCow/5101428
К. Норберт

Схоже, у вашому зразку $this->getFormErrorsмає бути помилка $this->getErrorMessagesдруку в Symfony2.1
Mick

@umpirsky Щоб отримати ім'я поля, я отримав це: $ child-> getConfig () -> getOptions () ['label'] Мене назавжди дізналися ...
jsgoupil

35

Використовуйте валідатор, щоб отримати помилки для певної сутності

if( $form->isValid() )
{
    // ...
}
else
{
    // get a ConstraintViolationList
    $errors = $this->get('validator')->validate( $user );

    $result = '';

    // iterate on it
    foreach( $errors as $error )
    {
        // Do stuff with:
        //   $error->getPropertyPath() : the field that caused the error
        //   $error->getMessage() : the error message
    }
}

Посилання API:


Дякую, що мені було потрібно +1
Філл Паффорд

4
Я не впевнений, що це вдалий підхід до перевірки кожної організації окремо. Що робити, якщо у вас складна ієрархічна форма? Друга проблема полягає в тому, що перевірка відбувається двічі.
Слава Фомін II,

3
@SlavaFominII - "Друга проблема полягає в тому, що перевірка відбувається двічі" - Добре, нічого не оновлюється! Цей самий список помилок після!
BentCoder

20

Для отримання належних (перекладаються) повідомлень, які зараз використовують SF 2.6.3, ось моя остаточна функція (оскільки, здається, жодне з перерахованих вище не працює):

 private function getErrorMessages(\Symfony\Component\Form\Form $form) {      
    $errors = array();
    foreach ($form->getErrors(true, false) as $error) {
        // My personnal need was to get translatable messages
        // $errors[] = $this->trans($error->current()->getMessage());
        $errors[] = $error->current()->getMessage();
    }

    return $errors;
}

як метод Form :: getErrors () тепер повертає екземпляр FormErrorIterator , якщо тільки ви не переключите другий аргумент ($ flatten) на true . (Після цього повернеться примірник FormError , і вам доведеться викликати метод getMessage () безпосередньо, без методу current ():

 private function getErrorMessages(\Symfony\Component\Form\Form $form) {      
    $errors = array();
    foreach ($form->getErrors(true, true) as $error) {
        // My personnal need was to get translatable messages
        // $errors[] = $this->trans($error->getMessage());
        $errors[] = $error->getMessage();
    }

    return $errors;
}

)

Найголовніше - це фактично встановити перший аргумент на істину, щоб отримати помилки. Залишивши другий аргумент ($ flatten) до його значення за замовчуванням ( true ) поверне екземпляри FormError , тоді як він поверне екземпляри FormErrorIterator, коли встановлено значення false.


Хороший, використовуючи ті ж речі.
Пошкоджені органічні

чи не так? :) @KidBinary
Cedo

Абсолютно чудова, товариш:)
Пошкоджена органічна

Кращий варіант: $ errors = array_map (функція ($ item) {return $ item-> current () -> getMessage ();}, $ кампаніяForm-> getErrors (вірно, помилково));
Енріке Керо

Гарне рішення для Symfony 2.7
Ян Чабо

16

За мої флеш-повідомлення я був задоволений $form->getErrorsAsString()

Правка (від Benji_X80): для використання у форматі SF3 $form->getErrors(true, false);


3
Я знаю, що це стара відповідь, але для подальшої довідки: This method should only be used to help debug a form.( джерело )
cheesemacfly

getErrorsAsString () застаріло в 3.0, використовуйте: $ form-> getErrors (true, false);
Benji_X80

15

Функція для symfony 2.1 і новіших, без застарілої функції:

/**
 * @param \Symfony\Component\Form\Form $form
 *
 * @return array
 */
private function getErrorMessages(\Symfony\Component\Form\Form $form)
{
    $errors = array();

    if ($form->count() > 0) {
        foreach ($form->all() as $child) {
            /**
             * @var \Symfony\Component\Form\Form $child
             */
            if (!$child->isValid()) {
                $errors[$child->getName()] = $this->getErrorMessages($child);
            }
        }
    } else {
        /**
         * @var \Symfony\Component\Form\FormError $error
         */
        foreach ($form->getErrors() as $key => $error) {
            $errors[] = $error->getMessage();
        }
    }

    return $errors;
}

Я збирався опублікувати нову відповідь на цю посаду, але ти, здавалося, перебив мене на удар. Мені довелося переглянути вихідний код, щоб зрозуміти, чому виклики методу не були знайдені.
Dr.Knowitall

Я помітив, що це не призводить до помилок із елементів, у яких помилка "помилки" встановлена ​​на "true". SF2.4
kinghfb

@stwe, яка мета першого IFтвердження? Чому вона взаємовиключна? Наскільки я бачу: форма може мати власні помилки, як і діти.
Слава Фомін II

4

Перекладені повідомлення про помилки форми (Symfony2.1)

Я багато намагався знайти цю інформацію, тому думаю, що напевно варто додати примітку про переклад помилок форми.

@Icode4foodвідповідь поверне всі помилки форми. Однак повернутий масив не враховує ні плюралізацію повідомлення, ні переклад .

Ви можете змінити цикл @Icode4foodвідповіді, щоб мати комбо:

  • Отримати всі помилки певної форми
  • Повернути перекладену помилку
  • При необхідності враховуйте плюралізацію

Ось:

foreach ($form->getErrors() as $key => $error) {

   //If the message requires pluralization
    if($error->getMessagePluralization() !== null) {
        $errors[] = $this->container->get('translator')->transChoice(
            $error->getMessage(), 
            $error->getMessagePluralization(), 
            $error->getMessageParameters(), 
            'validators'
            );
    } 
    //Otherwise, we do a classic translation
    else {
        $errors[] = $this->container->get('translator')->trans(
            $error->getMessage(), 
            array(), 
            'validators'
            );
    }
}

Цю відповідь було зібрано з трьох різних дописів:


Просто спробував вашу версію, і вона пішла Fatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization(). Я підозрюю, що це лише для Symfony 2.1?
Цар Піно

4

СИМФОНІЯ 3.X

Інші SF 3.X методи, наведені тут, не працювали для мене, оскільки я міг подати порожні дані до форми (але у мене є обмеження NotNull / NotBlanck). У цьому випадку рядок помилки буде виглядати приблизно так:

string(282) "ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be blank.
ERROR: This value should not be null.
name:
    ERROR: This value should not be blank.
"

Що не дуже корисно. Тому я зробив це:

public function buildErrorArray(FormInterface $form)
{
    $errors = [];

    foreach ($form->all() as $child) {
        $errors = array_merge(
            $errors,
            $this->buildErrorArray($child)
        );
    }

    foreach ($form->getErrors() as $error) {
        $errors[$error->getCause()->getPropertyPath()] = $error->getMessage();
    }

    return $errors;
}

Що поверне це:

array(7) {
  ["data.name"]=>
  string(31) "This value should not be blank."
  ["data.street"]=>
  string(31) "This value should not be blank."
  ["data.zipCode"]=>
  string(31) "This value should not be blank."
  ["data.city"]=>
  string(31) "This value should not be blank."
  ["data.state"]=>
  string(31) "This value should not be blank."
  ["data.countryCode"]=>
  string(31) "This value should not be blank."
  ["data.organization"]=>
  string(30) "This value should not be null."
}

3

Ви також можете скористатися послугою валідатора, щоб отримати порушення обмежень:

$errors = $this->get('validator')->validate($user);

6
Це підтвердить об'єкт, але не його форму. Якщо, наприклад, маркер CRSF став причиною помилки, повідомлення не включатиметься.
Icode4food

3

Перекладені повідомлення про помилки форми (Symfony2.3)

Моя версія вирішення проблеми:

/src/Acme/MyBundle/Resources/config/services.yml

services:
    form_errors:
        class: Acme\MyBundle\Form\FormErrors

/src/Acme/MyBundle/Form/FormErrors.php

<?php
namespace Acme\MyBundle\Form;

class FormErrors
{
    public function getArray(\Symfony\Component\Form\Form $form)
    {
        return $this->getErrors($form);
    }

    private function getErrors($form)
    {
        $errors = array();

        if ($form instanceof \Symfony\Component\Form\Form) {

            // соберем ошибки элемента
            foreach ($form->getErrors() as $error) {

                $errors[] = $error->getMessage();
            }

            // пробежимся под дочерним элементам
            foreach ($form->all() as $key => $child) {
                /** @var $child \Symfony\Component\Form\Form */
                if ($err = $this->getErrors($child)) {
                    $errors[$key] = $err;
                }
            }
        }

        return $errors;
    }
}

/src/Acme/MyBundle/Controller/DefaultController.php

$form = $this->createFormBuilder($entity)->getForm();
$form_errors = $this->get('form_errors')->getArray($form);
return new JsonResponse($form_errors);

У Symfony 2.5 ви можете дуже просто отримати всі помилки в полях:

    $errors = array();
    foreach ($form as $fieldName => $formField) {
        foreach ($formField->getErrors(true) as $error) {
            $errors[$fieldName] = $error->getMessage();
        }
    }

3

Для Symfony 3.2 і вище використовуйте це,

public function buildErrorArray(FormInterface $form)
{
    $errors = array();

    foreach ($form->getErrors() as $key => $error) {
        if ($form->isRoot()) {
            $errors['#'][] = $error->getMessage();
        } else {
            $errors[] = $error->getMessage();
        }
    }

    foreach ($form->all() as $child) {
        if (!$child->isValid()) {
            $errors[$child->getName()] = (string) $child->getErrors(true, false);
        }
    }
    return $errors;
}

Використовуйте str_replace, якщо ви хочете позбутися набридливого тексту " Помилка: " у кожному тексті опису помилок.

$errors[$child->getName()] = str_replace('ERROR:', '', (string) $child->getErrors(true, false));

2

Якщо ви використовуєте власні валідатори, Symfony не повертає помилки, створені тими валідаторами в $form->getErrors(). $form->getErrorsAsString()поверне всі потрібні помилки, але на жаль, її вихід форматується як рядок, а не масив.

Метод, який ви використовуєте для отримання всіх помилок (незалежно від того, звідки вони виникли), залежить від того, яку версію Symfony ви використовуєте.

Більшість запропонованих рішень передбачають створення рекурсивної функції, яка сканує всі дочірні форми та витягує відповідні помилки в один масив. Symfony 2.3 не має $form->hasChildren()функції, але вона має $form->all().

Ось допоміжний клас для Symfony 2.3, який ви можете використовувати для вилучення всіх помилок з будь-якої форми. (Він заснований на коді з коментаря компанії yapro щодо відповідного квитка про помилку в акаунті github Symfony.)

namespace MyApp\FormBundle\Helpers;

use Symfony\Component\Form\Form;

class FormErrorHelper
{
    /**
     * Work-around for bug where Symfony (2.3) does not return errors from custom validaters,
     * when you call $form->getErrors().
     * Based on code submitted in a comment here by yapro:
     * https://github.com/symfony/symfony/issues/7205
     *
     * @param Form $form
     * @return array Associative array of all errors
     */
    public function getFormErrors($form)
    {
        $errors = array();

        if ($form instanceof Form) {
            foreach ($form->getErrors() as $error) {
                $errors[] = $error->getMessage();
            }

            foreach ($form->all() as $key => $child) {
                /** @var $child Form */
                if ($err = $this->getFormErrors($child)) {
                    $errors[$key] = $err;
                }
            }
        }

        return $errors;
    }
}

Код виклику:

namespace MyApp\ABCBundle\Controller;

use MyApp\FormBundle\Helpers;

class MyController extends Controller
{
    public function XYZAction()
    {
        // Create form.

        if (!$form->isValid()) {
            $formErrorHelper = new FormErrorHelper();
            $formErrors = $formErrorHelper->getFormErrors($form);

            // Set error array into twig template here.
        }
    }

}

2

На основі відповіді @Jay Seth я створив версію класу FormErrors спеціально для Ajax Forms:

// src/AppBundle/Form/FormErrors.php
namespace AppBundle\Form;

class FormErrors
{

    /**
     * @param \Symfony\Component\Form\Form $form
     *
     * @return array $errors
     */
    public function getArray(\Symfony\Component\Form\Form $form)
    {
        return $this->getErrors($form, $form->getName());
    }

    /**
     * @param \Symfony\Component\Form\Form $baseForm
     * @param \Symfony\Component\Form\Form $baseFormName
     *
     * @return array $errors
     */
    private function getErrors($baseForm, $baseFormName) {
        $errors = array();
        if ($baseForm instanceof \Symfony\Component\Form\Form) {
            foreach($baseForm->getErrors() as $error) {
                $errors[] = array(
                    "mess"      => $error->getMessage(),
                    "key"       => $baseFormName
                );
            }

            foreach ($baseForm->all() as $key => $child) {
                if(($child instanceof \Symfony\Component\Form\Form)) {
                    $cErrors = $this->getErrors($child, $baseFormName . "_" . $child->getName());
                    $errors = array_merge($errors, $cErrors);
                }
            }
        }
        return $errors;
    }
}

Використання (наприклад, у вашій дії):

$errors = $this->get('form_errors')->getArray($form);

Версія Symfony: 2.8.4

Приклад відповіді JSON:

{
    "success": false,
    "errors": [{
        "mess": "error_message",
        "key": "RegistrationForm_user_firstname"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_lastname"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_email"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_zipCode"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_user_password_password"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_terms"
    }, {
        "mess": "error_message2",
        "key": "RegistrationForm_terms"
    }, {
        "mess": "error_message",
        "key": "RegistrationForm_marketing"
    }, {
        "mess": "error_message2",
        "key": "RegistrationForm_marketing"
    }]
}

Об'єкт помилки містить поле "ключ", яке є ідентифікатором вхідного елемента DOM, тому ви можете легко заповнити повідомлення про помилки.

Якщо у вас є дочірні форми всередині батьків, не забудьте додати cascade_validationпараметр всередині батьківської форми setDefaults.


1

Для Symfony 2.1 далі для використання з дисплеєм помилок Twig я змінив функцію, щоб додати FormError замість того, щоб просто їх отримувати, таким чином ви маєте більше контролю над помилками і не потрібно використовувати помилки_обладнання на кожному окремому вході. Якщо ви не встановите його в порядку нижче {{form_errors (form)}}, він залишиться порожнім:

/**
 * @param \Symfony\Component\Form\Form $form
 *
 * @return void
 */
private function setErrorMessages(\Symfony\Component\Form\Form $form) {      

    if ($form->count() > 0) {
        foreach ($form->all() as $child) {
            if (!$child->isValid()) {
                if( isset($this->getErrorMessages($child)[0]) ) {
                    $error = new FormError( $this->getErrorMessages($child)[0] );
                    $form->addError($error);
                }
            }
        }
    }

}


1

Я придумав таке рішення. Він працює надійно з останньою Symfony 2.4 .

Я спробую дати кілька пояснень.

Використання окремого валідатора

Я думаю, що погана ідея використовувати окрему перевірку для перевірки сутності та повернення повідомлень про порушення обмежень, як це пропонують інші автори.

  1. Вам потрібно буде вручну перевірити всі сутності, вказати групи перевірки тощо. Складні ієрархічні форми взагалі не практичні і швидко вийдуть з рук.

  2. Таким чином ви будете перевіряти форму двічі: один раз з формою та один раз з окремим валідатором. Це погана ідея з точки зору продуктивності.

Я пропоную рекурсивно повторювати тип форми разом із дітьми, щоб збирати повідомлення про помилки.

Використання деяких запропонованих методів з ексклюзивним оператором IF

Деякі відповіді, запропоновані іншими авторами, містять взаємовиключні твердження IF на зразок цього: if ($form->count() > 0)або if ($form->hasChildren()).

Наскільки я бачу, кожна форма може мати помилки, як і діти. Я не знаю компонента Symfony Forms , але на практиці ви не отримаєте помилок самої форми, як, наприклад, помилка захисту CSRF або додаткові поля . Я пропоную зняти це розділення.

Використання денормалізованої структури результатів

Деякі автори пропонують розмістити всі помилки у простому масиві. Таким чином, всі повідомлення про помилки самої форми та її дітей будуть додані до одного масиву з різними стратегіями індексації: на основі чисельності для власних помилок типу та на основі імен для помилок дітей. Я пропоную використовувати нормовану структуру даних форми:

errors:
    - "Self error"
    - "Another self error"

children
    - "some_child":
        errors:
            - "Children error"
            - "Another children error"

        children
            - "deeper_child":
                errors:
                    - "Children error"
                    - "Another children error"

    - "another_child":
        errors:
            - "Children error"
            - "Another children error"

Таким чином результат можна легко повторити пізніше.

Моє рішення

Тож ось моє рішення цієї проблеми:

use Symfony\Component\Form\Form;

/**
 * @param Form $form
 * @return array
 */
protected function getFormErrors(Form $form)
{
    $result = [];

    // No need for further processing if form is valid.
    if ($form->isValid()) {
        return $result;
    }

    // Looking for own errors.
    $errors = $form->getErrors();
    if (count($errors)) {
        $result['errors'] = [];
        foreach ($errors as $error) {
            $result['errors'][] = $error->getMessage();
        }
    }

    // Looking for invalid children and collecting errors recursively.
    if ($form->count()) {
        $childErrors = [];
        foreach ($form->all() as $child) {
            if (!$child->isValid()) {
                $childErrors[$child->getName()] = $this->getFormErrors($child);
            }
        }
        if (count($childErrors)) {
            $result['children'] = $childErrors;
        }
    }

    return $result;
}

Я сподіваюся, що це комусь допоможе.


@weaverryan, будь ласка, можете подивитися на моє рішення? Чи дійсно це, чи є недоліки чи помилки? Дякую!
Слава Фомін II

1

СИМФОНІЯ 3.1

Я просто реалізував статичний метод для обробки відображення помилок

static function serializeFormErrors(Form\Form $form)
{
    $errors = array();
    /**
     * @var  $key
     * @var Form\Form $child
     */
    foreach ($form->all() as $key => $child) {
        if (!$child->isValid()) {
            foreach ($child->getErrors() as $error) {
                $errors[$key] = $error->getMessage();
            }
        }
    }

    return $errors;
}

Сподіваючись на допомогу


1

Symfony 3 і новіші

Нещодавно я зробив функцію, яка створює дерево помилок форми. Це буде корисно для повернення списку помилок назад до переднього. Це засновано на типах форм, які мають:

'error_bubbling' => false

Код:

public static function getFormErrorsTree(FormInterface $form): array
{
    $errors = [];

    if (count($form->getErrors()) > 0) {
        foreach ($form->getErrors() as $error) {
            $errors[] = $error->getMessage();
        }
    } else {
        foreach ($form->all() as $child) {
            $childTree = self::getFormErrorsTree($child);

            if (count($childTree) > 0) {
                $errors[$child->getName()] = $childTree;
            }
        }
    }

    return $errors;
}

Вихід:

Array
(
    [name] => Array
        (
            [0] => This value is not valid.
        )

    [emails] => Array
        (
            [0] => Array
                (
                    [0] => Given e-mail is not valid.
                    [1] => Given e-mail is not valid #2.
                )
            [1] => Array
                (
                    [0] => Given e-mail is not valid.
                    [1] => Given e-mail is not valid #2.
                )

        )

)

Зауважте : я знаю, що помилки з полів більш глибокого рівня можуть бути перезаписані, якщо вищий рівень має помилки, але це спеціально для мого використання.


Ідеально підходить для var_dump, дякую
ReaperSoon

0

Для Symfony 2.1:

Це моє остаточне рішення, що поєднує багато інших рішень:

protected function getAllFormErrorMessages($form)
{
    $retval = array();
    foreach ($form->getErrors() as $key => $error) {
        if($error->getMessagePluralization() !== null) {
            $retval['message'] = $this->get('translator')->transChoice(
                $error->getMessage(), 
                $error->getMessagePluralization(), 
                $error->getMessageParameters(), 
                'validators'
            );
        } else {
            $retval['message'] = $this->get('translator')->trans($error->getMessage(), array(), 'validators');
        }
    }
    foreach ($form->all() as $name => $child) {
        $errors = $this->getAllFormErrorMessages($child);
        if (!empty($errors)) {
           $retval[$name] = $errors; 
        }
    }
    return $retval;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.