代码之家  ›  专栏  ›  技术社区  ›  Aliance

将约束传递给symfony集合类型

  •  2
  • Aliance  · 技术社区  · 8 年前

    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()]),
                ])
            ;
        }
    }
    

    我还有 ThirdFormType FirstFormType 但其他约束传递给 SecondFormType .但我想替换 new SecondFormType([...])

    1 回复  |  直到 8 年前
        1
  •  2
  •   yceruto    8 年前

    从表单类型迁移此类构造函数参数的推荐方法是为其创建表单选项,如下所示:

    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)], 
                ],
                // ...
            ])
        ;
    }
    
    推荐文章