5

Symfony2 フォームを使用して、API への POST および PUT リクエストを検証しています。フォームは、要求データを基になるエンティティにバインドし、エンティティを検証します。エラーの収集を除いて、すべてがうまく機能しています。私は FOSRestBundle を使用しており、Symfony\Component\HttpKernel\Exception\HttpException をステータス コード 400 でスローし、検証が失敗した場合はフォーム エラー メッセージを含むメッセージをスローしています。FOSRestBundle は、これを JSON 応答に変換します。これらすべてを実行する必要があるコントローラー メソッドは、次のようになります (すべてのフィールドがエラーをフォームにバブルします)。

protected function validateEntity(AbstractType $type, $entity, Request $request)
{
    $form = $this->createForm($type, $entity);
    $form->bind($request);
    if (! $form->isValid()) {
        $message = ['Invalid parameters passed.'];
        foreach ($form->getErrors() as $error) {
            $message[] = $error->getMessage();
        }
        throw new HttpException(Codes::HTTP_BAD_REQUEST, implode("\n", $message));
    }
}

私が抱えている問題は、$form->getErrors() を使用してフォーム レベルのエラーを収集すると、エラー メッセージにしかアクセスできず、エラーが接続されているフィールドの名前にはアクセスできないことです。これは、POST または PUT パラメータが関連エンティティの ID に対応する場合に特に問題になります。無効な値が送信された場合、そのエラー メッセージは単純に「この値は無効です」であり、このコンテキストではあまり適切ではありません。理想的には、次のいずれかを実行したいと考えています。

  • エラーごとに、それが接続されているフィールド名を取得して、「フィールド名: エラー メッセージ」のようなメッセージをフォーマットできるようにします。
  • それが不可能な場合、無効なエンティティ タイプのエラー メッセージをカスタマイズして、「この値は無効です」よりも適切なメッセージが表示されるようにすることはできますか?
4

7 に答える 7

8

この関数を使用して、フォームをバインドした後にすべてのエラー メッセージを取得します。

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;
}
于 2012-12-07T12:24:40.830 に答える
5

getErrorsAsStringメソッドを例として、必要な機能を取得できます。また、メッセージinvalid_messageを変更するには、フォーム フィールドにオプションを設定する必要がありThis value is invalidます。

于 2012-09-23T19:55:55.670 に答える
3

すべてを試してみましたが、私が望むようには何も機能しませんでした。
これがSymfony 4での私の試みです(また、フレームワークでデフォルトでこれが利用できない理由は私を超えています.Ajaxでフォームを使用することを彼らが望んでいないようです:思考:)

これはメッセージ配列を返します。キーは Symfony によって生成される dom id です (配列でも機能します)。

//file FormErrorsSerializer.php
<?php

namespace App\Helper;

use Symfony\Component\Form\Form;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormErrorIterator;

class FormErrorsSerializer
{
    public function getFormErrors(Form $form): array
    {
        return $this->recursiveFormErrors($form->getErrors(true, false), [$form->getName()]);
    }

    private function recursiveFormErrors(FormErrorIterator $formErrors, array $prefixes): array
    {
        $errors = [];

        foreach ($formErrors as $formError) {
            if ($formError instanceof FormErrorIterator) {
                $errors = array_merge($errors, $this->recursiveFormErrors($formError, array_merge($prefixes, [$formError->getForm()->getName()])));
            } elseif ($formError instanceof FormError) {
                $errors[implode('_', $prefixes)][] = $formError->getMessage();
            }
        }

        return $errors;
    }
}
于 2018-09-11T18:38:14.437 に答える
1

この問題を解決するためにバンドルを作成しました。

ここで入手できます:

https://github.com/Ex3v/FormErrorsBundle

貢献は大歓迎です。乾杯。

于 2014-06-08T18:30:53.430 に答える