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

それには2つの方法があります。

  • エラー時にユーザーをリダイレクトせず、{{ form_errors(form) }}テンプレートファイル内に表示しない
  • エラー配列にアクセス $form->getErrors()

22
私はあなたが提案した2番目のことをしましたが、form-> getErrors()は空の配列を返します。
putolaruan 2011

2
私も最初のものを実行しました(phpテンプレート<?php echo $ view ['form']-> errors($ form)?>を使用)が、まだ空です!
putolaruan 2011

59
@mives error_bubblingすべてのフィールドのオプションを明示的に設定して、フォームタイプでtrueに設定する必要があります。
kgilden 09/10/11

5
カスタムバリデーターを使用している場合、Symfonyはそれらのバリデーターによって生成されたエラーを$ form-> getErrors()で返しません。
Jay Sheth

13
$form->getErrors(true)子フォームのエラーを含めることもできます
Chris

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の最も正解のようです。
Slava Fomin II 14

@Flip itは2.5で完璧に機能します
iarroyo 2014

1
すばらしい回答です$errors[$child->getName()] = $this->getErrorMessages($child);が、getErrorMessagesSymfony \ Bundle \ FrameworkBundle \ Controller \ Controllerコンポーネントにないため、例外がスローされていました。だから私はそれを交換しました$form_errors[$child->getName()] = $child->getErrorsAsString();
アハドアリ

3
@AhadAliは再帰関数なので、この機能が必要なクラスにコードスニペットを配置すると、コードスニペット自体を呼び出すことができます。「修正」により、ネストされたフォームに到達できなくなります。それは37人の他の人のために働いた、それもあなたのために働くべきである;)
Flip

@Flip Ahごめんなさい、私は見ているだけで$this->getErrorMessages()、コントローラーとSymfony apiの一部の中で直接呼び出されると思いました。
Ahad Ali、

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を改善しましたが、まだ望んでいません。配列キーをフィールド名にしたいのですが、そうではありません。
umpirsky、2012年

9
@SalmanPK Twigは、上記のコードのどこにも参照されていません。私はあなたのコメントを理解しているとは思わない。
Icode4food 2012

1
これは以前の要点の修正です。これはSymfony 2.1.7で動作します。gist.github.com/WishCow/5101428
K. Norbert

Symfony2.1のサンプルにタイプミスがある$this->getFormErrorsはずです$this->getErrorMessages
Mick

@umpirskyフィールド名を取得するには、私はこれだ:$チャイルド> GETCONFIG() - > GETOPTIONSを()[ 'ラベル']を見つけるために永遠に連れて行ってくれました...
jsgoupil

35

Validatorを使用して特定のエンティティのエラーを取得する

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
Phill Pafford 2012年

4
各エンティティを個別に検証するのが良いアプローチかどうかはわかりません。複雑な階層形式がある場合はどうなりますか?2番目の問題は、検証が2回発生することです。
Slava Fomin II 14

3
@SlavaFominII-「2番目の問題は検証が2回行われることです」-良い点、何も更新されません!同じエラーリスト!
BentCoder 2014

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

2番目の引数($ flatten)をtrueに切り替えない限り、Form :: getErrors()メソッドはFormErrorIteratorのインスタンスを返すようになりました。(これにより、FormErrorインスタンスが返されるため、current()メソッドを使用せずにgetMessage()メソッドを直接呼び出す必要があります。

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

最も重要なことは、実際にエラーを取得するために最初の引数をtrueに設定することです。2番目の引数($ flatten)をデフォルト値(true)のままにすると、FormErrorインスタンスが返さますが、falseに設定するとFormErrorIteratorインスタンスが返されます。


同じものを使用していいもの。
破損したオーガニック

ね?:) @KidBinary
Cedo

絶対にゴージャス、仲間:)
破損したオーガニック

より良いオプションは次のとおりです:$ errors = array_map(function($ item){return $ item-> current()-> getMessage();}、$ campaignForm-> getErrors(true、false));
Enrique Quero

Symfony 2.7の優れたソリューション
Yann Chabot

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 2016

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 2013

これは、エラーバブリングがtrueに設定されているアイテムからエラーを取得しないことに気づきました。SF2.4
kinghfb

@stwe最初のIFステートメントの目的は何ですか?なぜ相互に排他的ですか?私の知る限り:フォームには、子だけでなく独自のエラーが含まれる可能性があります。
Slava Fomin II

4

翻訳済みフォームのエラーメッセージ(Symfony2.1)

私はこの情報を見つけるために多くの苦労をしてきましたので、フォームエラーの翻訳についてのメモを追加することは間違いなく価値があると思います。

@Icode4food回答はフォームのすべてのエラーを返します。ただし、返される配列では、メッセージの複数化変換は考慮されません。

@Icode4food回答のforeachループを変更して、コンボを作成できます。

  • 特定のフォームのすべてのエラーを取得する
  • 翻訳されたエラーを返す
  • 必要に応じて複数化を考慮に入れる

ここにあります:

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

この回答は、3つの異なる投稿からまとめられています。


ちょうどあなたのバージョンを試してみました、そしてそれは行きましたFatal Error: Call to undefined method Symfony\Component\Form\FormError::getMessagePluralization()。これはSymfony 2.1専用だと思いますか?
Czar Pino

4

SYMFONY 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 2011年

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のバージョンによって異なります。

推奨されるソリューションのほとんどは、すべての子フォームをスキャンし、関連するエラーを1つの配列に抽出する再帰関数の作成を含みます。symfony 2.3には$form->hasChildren()機能はありませんが、はあり$form->all()ます。

以下はSymfony 2.3のヘルパークラスです。これを使用して、あらゆるフォームからすべてのエラーを抽出できます。(これは、Symfonyのgithubアカウントの関連するバグチケットに関するyaproのコメントからのコードに基づいています。)

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の回答に基づいて、特にAjaxフォーム用のFormErrorsクラスのバージョンを作成しました。

// 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要素のIDである「キー」フィールドが含まれているため、エラーメッセージを簡単に入力できます。

親の中に子フォームがある場合はcascade_validation、親フォームの内にオプションを追加することを忘れないでくださいsetDefaults


1

Twigエラー表示で使用するSymfony 2.1以降では、単にエラーを取得する代わりに、FormErrorを追加するように関数を変更しました。これにより、エラーをより詳細に制御でき、個々の入力ごとにerror_bubblingを使用する必要がなくなります。以下の方法で設定しない場合、{{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. このようにして、フォームを2回検証します。1回はフォームで、もう1回は個別のバリデータで検証します。これは、パフォーマンスの観点からは悪い考えです。

エラーメッセージを収集するために、フォームタイプをその子で再帰的に反復することをお勧めします。

排他的なIFステートメントでいくつかの推奨メソッドを使用する

別の著者が提案したいくつかの回答には、次のような相互に排他的なIFステートメントが含まれています:if ($form->count() > 0)またはif ($form->hasChildren())

私の知る限り、すべてのフォームにエラーがあるだけでなく、子供もいる可能性があります。私はSymfonyフォームコンポーネントの専門家ではありませんが、実際には、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、私のソリューションを見てください。それは有効ですか、それとも欠点や誤解がありますか?ありがとうございました!
Slava Fomin II

1

SYMFONY 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に
最適

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.