我有一個這樣的形式在我的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個字符,我也會在用戶輸入後恢復。
我在哪裏錯了?
沒有什麼不對您的代碼是真實的。驗證約束應該可以正常工作。你在使用任何驗證組嗎? –
@MikhailProsalov感謝您的評論,不,我不在這裏使用驗證組。 –
請嘗試將'mapped'=> false添加到您的artistNumber字段選項數組中。 –