63

Symfony2で生成されたCRUDフォームに問題があります。(MongoDBドキュメントを使用しますが、これは関連しているとは思いません)

コントローラのcreateAction()メソッドで、フォームの結果をデバッグすると、次のようになります。

$form->isValid() // returns false

$form->getErrors() // returns en empty array(0) {}

form_errors(form)そのため、Twigテンプレートで何も使用していません($form->getErrors()空のリターンのために正常に見えます)

そして、書かれた値は次の形式で置き換えられません...

誰かアイデアがありますか?

4

11 に答える 11

64

最初に理解しておくべきことは、検証はフォームではなくモデルで行われるということです。フォームにエラーが含まれる可能性がありますが、それは検証されないプロパティにマップされたフィールドがある場合のみです。そのため、フォームに無効なフィールド (NotNullフォームにないプロパティに対するアサーションなど) が含まれていない場合、エラーは表示されません。

2 つ目は$form->getErrors()、そのレベルのエラーのみを表示することです。各フォームの子には独自のエラーを含めることができます。したがって、エラーをチェックしたい場合は、フィールドをループして、各フィールドで getErrors を呼び出す必要があります。Form クラスのgetErrorsメソッドは、そのように欺くことができます。

于 2012-06-27T19:47:01.240 に答える
63

フォームをデバッグするには、$form->getErrorsAsString()代わりに$form->getErrors().

$form->getErrorsAsString()フォームをデバッグするためにのみ使用する必要があります... の場合ではない各子要素のエラーが含まれます$form->getErrors()

ピーターが言及しているよう$form->getErrors()に、子フォームのすべてのエラーの合計は返されません。

フォームが無効で、getErrors() が空の配列を返す仕組みを理解するには、symfony フォーム クラスのisValid()メソッドを参照してください。ご覧のとおり、フォームが有効でないケースが 2 つあります。最初のケースは一般的なフォームのテストであり、2 番目のケースは各子要素のテストです。

public function isValid()
{
    //...

    //CASE I : IF CHILD ELEMENTS HAVE ERRORS, $this->errors WILL CONTAIN
    //THE ERROR ON THE CHILD ELEMENT AND NOT ON THE GENERAL 'errors' FIELD 
    //ITSELF

    if (count($this->errors) > 0) {
        return false;
    }

    //CASE II: AND THIS IS WHY WE ARE TESTING THE CHILD ELEMENTS AS WELL
    //TO CHECK WHETHER THERE ARE VALID OR NOT

    if (!$this->isDisabled()) {
        foreach ($this->children as $child) {
            if (!$child->isValid()) {
                return false;
            }
        }
    }

    return true;
}

したがって、各フォームの子にはエラーが含まれる可能性がありますが、$form->getErrors()それ自体がすべてのエラーを返すわけではありません。多くの子要素を持つフォームを考えると、CSRF が正しくない場合、通常 $form->getErrors() で CSRF エラーが発生します。

于 2012-12-29T09:32:49.693 に答える
3

はい、正しいです。Peter Kruithof SF 2.8 では、フィールドのエラーを取得するのが私の機能です。

 private function getErrorsForm(\Symfony\Component\Form\Form $form)
{
    $response =  array();

    foreach ($form as $child) {
         foreach ($child->getErrors(true) as $error) {
            $response[$child->getName()][] = $error->getMessage();
         }
    }

    return $response;
}
于 2016-11-30T15:36:28.827 に答える
3

送信ボタンがあったとしても、フォームは送信されませんでした。問題を解決するためにコードを追加しました

$request = $this->get('request');
if($request->isMethod("POST")){
      $form->submit($request);
        if($form->isValid()){
        // now true
        }
}
于 2013-09-11T20:02:22.993 に答える
1

このエラーに遭遇し、リクエストを「処理」するのを忘れていたことに気付きました。あなたの周りにそれがあることを確認してください...

public function editAction(Request $request)
{
    $form = $this->createForm(new CustomType(),$dataObject);
    /**  This next line is the one I'm talking about... */
    $form->handleRequest($request);
    if ($request->getMethod() == "POST") {
        if ($form->isValid()) {
        ...
于 2016-12-14T05:30:44.550 に答える
0

検証に問題があるようです。送信時にフォームが検証されていません。検証に注釈を使用していると仮定します。これがエンティティの上部にあることを確認してください。

use Symfony\Component\Validator\Constraints as Assert;

また、これは各プロパティの上にあります

/**      
 * @Assert\NotBlank()      
 */

NotBlank()、ニーズに合わせて任意の制約に変更できます。

検証の詳細については、 http ://symfony.com/doc/current/book/validation.html を参照してください。

Assert 制約の詳細については、 http ://symfony.com/doc/current/book/validation.html#constraints を参照してください。

于 2012-06-27T18:19:09.590 に答える