2017-02-28 2 views
0

私はsymfony 3.2プロジェクトに取り組んでおり、単純なクレジットカードフォームに少しの検証を加えています。 2.7プロジェクトで同様のフォームを作成し、constraintsオプションを使用しました。データクラスのないフォームへの制約

  ->add('SecurityCode', TextType::class, array(
       'required' => true, 
       'constraints' => array(
         new Length(array('min' => 3)), 
         new Length(array('max' => 3))), 
       'empty_data' => null 
      )) 

これを3.2で実行すると、「オプション '制約が存在しません」というエラーが表示されます。私はドキュメントを見て、2つのバージョンの間でそれは使用の違いを示していません。何か不足していますか?

エラーメッセージを追加しています... enter image description here

EDIT: それは私がフォームを呼んでいる方法である可能性があります。私は自分のFormFactoryを作っているので、コントローラでフォームを作っていません。

 use Symfony\Component\Form\Forms; 

     //... 

     $x = Forms::createFormFactory(); 

     $form = $x->create('My\Bundle\Form\CreditCardFormType'); 

そして、ここでは、あなたのファイルの先頭にこのuse文を持っていることを確認し、私にformType

namespace My\Bundle\Form; 

    use Symfony\Component\Form\AbstractType; 
    use Symfony\Component\Form\FormBuilderInterface; 
    use Symfony\Component\OptionsResolver\OptionsResolver; 
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
    use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
    use Symfony\Component\Form\Extension\Core\Type\TextType; 
    use Symfony\Component\Validator\Constraints\Length; 
    use Symfony\Component\Validator\Constraints as Assert; 

    class CreditCardFormType extends AbstractType 
    { 
     /** 
     * {@inheritdoc} 
     */ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     {  
      $builder 
       ->add('cardType', ChoiceType::class, array(
        'label' => 'Payment Type', 
        'choices' => array(
           'visa' => 'visa', 
           'mastercard' => 'mastercard', 
           'discover' => 'discover' 
           ), 
        'data' => 'visa', 
        'required' => true, 
        'multiple' => false, 
        'expanded' => true, 
       )) 
       ->add('CardNumber', TextType::class, array(
        'required' => true, 
        'constraints' => array(
         new Assert\CardScheme(array(
          'schemes' => array('VISA', 'MASTERCARD', 'DISCOVER'), 
          'message' => 'The credit card number you entered is invalid.') 
          )), 
        'empty_data' => null 
       )) 
       ->add('SecurityCode', TextType::class, array(
        'required' => true, 
        'constraints' => array(
         new Length(array('min' => 3)), 
         new Length(array('max' => 3))), 
         'empty_data' => null 
       )) 
       ->add('ExpMonth', ChoiceType::class,array('required' => true, 'choices' => (range(0,12)))) 
       ->add('ExpYear', ChoiceType::class, array('required' => true, 'choices' => array(
        Date('Y') => Date('Y'), 
        Date('Y') + 1 => Date('Y') + 1, 
        Date('Y') + 2 => Date('Y') + 2, 
        Date('Y') + 3 => Date('Y') + 3, 
        //...add more years 
       ->add('save', SubmitType::class, array('label' => 'Place Order')) 
      ; 
     } 

     /** 
     * {@inheritdoc} 
     */ 
     public function configureOptions(OptionsResolver $resolver) 
     { 
      $resolver->setDefaults(array(
       'data_class' => null, 
      )); 
     } 

     /** 
     * {@inheritdoc} 
     */ 
     public function getBlockPrefix() 
     { 
      return 'credit_card_form'; 
     } 

    } 
+0

'createFormBuilder'セクションも表示して、フォームの作成方法を教えてください。私は問題がそこにあると思う。 –

+0

ええ、私はそれもそこにあるかもしれないと思っていた。 – Cathmor

+0

EDIT#2セクションを追加しました - >それを試すことができますか? –

答えて

0

次のとおりです。また

use Symfony\Component\Validator\Constraints\Length; 

、私はあなたがこのように記述する必要があると思います:

->add('SecurityCode', TextType::class, array(
    'required' => true, 
    'constraints' => array(
     new Length(array('min' => 3, 'max' => 3)), 
    'empty_data' => null 
)) 

途中で余分な閉じ括弧 - >それが問題を引き起こしたかどうかは分かりません。


フィードバックに基づいて編集#2。

/** 
* {@inheritdoc} 
*/ 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $collectionConstraint = new Collection(array(
     'CardNumber' => array(
      new Assert\CardScheme(array(
       'schemes' => array('VISA', 'MASTERCARD', 'DISCOVER'), 
       'message' => 'The credit card number you entered is invalid.')) 
     ), 
     'SecurityCode' => array(
      new Length(array('min' => 3, 'max' => 3)) 
     ) 
    )); 

    $resolver->setDefaults(array(
     'data_class' => null, 
     'constraints' => $collectionConstraint 
    )); 
} 

私はそれが正しいことだと思うが、私のために二重にチェック:

あなたconfigureOptionsでこれを試してみてください。

+0

うん、私はuseステートメントを持っていて、ここに貼り付けるためにコピーするときに閉じ括弧が欠けているかもしれません。 – Cathmor

+0

まだエラーが発生しますか? –

+0

さて、制約は配列の有効なキーではないというエラーです。 – Cathmor

関連する問題