2017-07-13 9 views
1

Symfony 2.8。私はフォームとしてカスタムエントリを持つコレクションを使用していますが、いくつかの制約が渡されています。symfonyコレクションタイプへの制約の受け渡し

FirstFormType.php:今、私のコードは次のようになります

class FirstFormType extends AbstractFormType 
{ 
    /** @inheritdoc */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('rates', CollectionType::class, [ 
       'entry_type' => new SecondFormType([new LessThanOrEqual(300)]), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'delete_empty' => true, 
       'constraints' => [ 
        new NotBlank(), 
        new Count(['min' => 1]), 
       ], 
      ]) 
     ; 
    } 
} 

SecondFormType.php

class SecondFormType extends AbstractFormType 
{ 
    /** @var array */ 
    private $constraints; 

    /** @param array $constraints */ 
    public function __construct(array $constraints = []) 
    { 
     $this->constraints = $constraints; 
    } 

    /** @inheritdoc */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('amount', NumberType::class, [ 
       'scale'  => 2, 
       'constraints' => array_merge($this->constraints, [new CustomConstraint()]), 
      ]) 
     ; 
    } 
} 

はまた、私は FirstFormTypeとしてではなく、 SecondFormTypeに渡された他の制約と同じである ThirdFormTypeを、持っていました。しかし、私は new SecondFormType([...])をFQCNに置き換えたいと思います。私は制約をより正確に継承できると思います。どうすればいいですか?

答えて

3

フォームタイプからコンストラクタ引数のこの種を移行するための推奨方法は、彼らのために、フォームのオプションを作成して、このような何か:

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefault('amount_constraints', array()); 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('amount', NumberType::class, [ 
      'scale' => 2, 
      'constraints' => array_merge($options['amount_constraints'], [new CustomConstraint()]), 
     ]) 
    ; 
} 

はその後、あなたの新しいオプションの使用方法は、次のようになります

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('rates', CollectionType::class, [ 
      'entry_type' => SecondFormType::class, 
      'entry_options' => [ 
       'amount_constraints' => [new LessThanOrEqual(300)], 
      ], 
      // ... 
     ]) 
    ; 
} 
+0

これは、ありがとうございます! – Aliance

関連する問題