2016-09-08 13 views
1

私は奇妙な問題があります。無効なデータでもsymfonyフォームが有効です

私のフォームは、提供されたデータがそうでない場合でもsymfonyによって有効です。このフォームは、AJAXリクエストによって作成され、投稿される(これは、それに影響を与えることができる)この(xdebugのとretvrieved)のように見えるデータで

if(!$request->isXmlHttpRequest()){ 
     return new JsonResponse(['code' => 403], 403); 
    } 

    $name = $request->query->get('name'); 

    $contact = new Contact(); 
    $contact->setName($name); 

    $form = $this->get('form.factory')->create(ContactType::class, $contact); 

    if($request->isMethod('POST')){ 
     $form->submit($request); 
     if($form->isValid()){ 
      $em = $this->get('doctrine.orm.entity_manager'); 

      $em->persist($contact); 
      $em->flush(); 

      return new JsonResponse(['code' => 200, 'id' => $contact->getId(), 'name' => $contact->getName()]); 
     } 

     return new JsonResponse(['formView' => $this->renderView('@MyBundle/Contacts/contactForm.html.twig',['form' =>$form->createView()]), 'code' => 400, 'errors' => $form->getErrors(true)]); 
    } 

    return new JsonResponse(['formView' => $this->renderView('@MyBundle/Contacts/contactForm.html.twig',['form' =>$form->createView()]), 'code' => 200], 200); 

'id' => NULL, 
    'name' => NULL, 
    'companyId' => NULL, 
    'companyTaxId' => NULL, 
    'birthNumber' => NULL, 
    'phoneLandLine' => NULL, 
    'phoneMobile' => NULL, 
    'phoneFax' => NULL, 
    'email' => NULL, 
    'www' => NULL, 

問題は、設定された名前であり、フォームは有効とマークされていてもエラーはありませんが、必要に応じてnullです。この後、必須フィールドの欠落に関する教義の例外があります。

これがどうして起こりますか?

のSymfony v2.8.10、Doctrineのv1.6.4

+0

は名前がエンティティにNULLを持たせないように設定されますか? – olibiaz

+0

'isMethod'の代わりに' submit'と 'isSumitted'の代わりに' handleRequest'を使用してください。http://symfony.com/doc/current/best_practices/forms.html#handling-form-submitsのサンプルベストプラクティスを参照してください。あなたの制約は 'Contact'クラスの中にあります。 – yceruto

+0

はい、nullに設定されていません(または参照されていない変数のデフォルトのdoctrine動作)。しかし、私はいつもフォームフィールドの私の定義は、それが必要であるかどうかを言うものだと考えました。 私はhandleRequestとisSubmittedを試しましたが、それはサブミットされたフォームからデータを取得する方法が異なるだけです。検証そのものは、両方の方法では機能しませんでした。 –

答えて

0

必要属性がバリデータとして動作しません。 からの引用:http://symfony.com/doc/2.8/reference/forms/types/text.html#required

trueの場合、HTML5必須属性がレンダリングされます。対応するラベルは、必要なクラスとともにレンダリングされます。

これは検証の対象外であり、検証とは独立しています。あなたのフィールドタイプを推測させる場合、このオプションの値は検証情報から推測されます。

おそらく、検証は、 "名前" フィールドが使用できないため、http://symfony.com/doc/2.8/forms.html#form-validation

+0

エンティティにAssert制約を追加しましたが、それは役に立ちませんでした。私はこの可能な解決策を試し、symfonyを深く見てみましょう。なぜ検証がうまくいかないのですか? –

0

を見てみましょう。それを有効にするには - あなたのエンティティにNotBlankアノテーションを追加します。

/** 
* @var string 
* 
* @ORM\Column(name="name", type="string", length=255) 
*  
* @Assert\NotBlank() 
*/ 
private $name; 

http://symfony.com/doc/current/reference/constraints/NotBlank.html

またはフォームに直接制約を追加します。

$builder 
     ->add('name', TextType::class, [ 
      'constraints' => [ 
       new \Symfony\Component\Validator\Constraints\NotBlank(), 
      ], 
     ]) 
関連する問題