2016-10-18 167 views
0

我有一個這樣的形式在我的symfony項目,請注意關注領域是不是一個映射的一個:symfony的表單驗證不起作用

<?php 

namespace MyApp\MyBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

// validators and constraints 
use Symfony\Component\Validator\Constraints\Length; 

class ArtistWithConstraintType extends AbstractType 
{ 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $artist = $options['data']; 
     $builder 
      ->add('professional', 'choice', array(
        'expanded' => true, 
        'multiple' => false, 
        'choices' => array(false => 'You are a self-educated', true => 'You are a professional'), 
        'required' => true, 
       )) 
      ; 

     if ($artist && $artist->getProfessional()) { 
      $builder->add('artistNumber', 'text', array(
       'constraints' => array(
            new Length(array(
             'max' => 14, 
             'min' => 14))), 
       'required' => true, 
       )) 
      ; 
     } else { 
      $artist->setArtistNumber(null); 
      $builder->remove('artistNumber') 
      ; 
     } 
    } 

    /** 
    * @param OptionsResolverInterface $resolver 
    */ 
    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'MyApp\MyBundle\Entity\Artist', 
      'csrf_protection' => true, 
      'csrf_field_name' => '_token_artist', 
      // a unique key to help generate the secret token 
      'intention'  => 'artist_item', 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'app_artist'; 
    } 
} 

事實上,在這種形式我問藝術家,如果是專業與否。否則,不需要採取任何行動。如果屬實,則通過ajax方法顯示名爲artistNumber的字段。

現在,一切正常。驗證約束條件除外:

'constraints' => array(
    new Length(array(
     'max' => 14, 
     'min' => 14))), 

確實,artistNumber字段必須是隻有14個字符的字符串,不能少於一個。但是當我驗證我的表單時,這個驗證約束沒有被考慮。

我沒有問題在視圖中顯示窗體,沒有問題,或者沒有問題來恢復artistNumber字段中的用戶條目。但是,如果用戶輸入的字符串長度少於或多於14個字符,則驗證不起作用,並且即使用戶輸入少於或多於14個字符,我也會在用戶輸入後恢復。

我在哪裏錯了?

+0

沒有什麼不對您的代碼是真實的。驗證約束應該可以正常工作。你在使用任何驗證組嗎? –

+0

@MikhailProsalov感謝您的評論,不,我不在這裏使用驗證組。 –

+1

請嘗試將'mapped'=> false添加到您的artistNumber字段選項數組中。 –

回答

0

在添加約束條件之前,您有一個條件。檢查條件

$artist && $artist->getProfessional() 

因爲你是suposing

+0

確實,這是一個很好的建議,但我檢查'$ artist && $ artist-> getProfessional()'是否如我所想的那樣是真的,並且是的,所以我不認爲問題在於這種情況。 –