将约束传递给symfony集合类型

时间:2017-07-13 09:49:06

标签: php symfony symfony-forms symfony-2.8 symfony-validator

Symfony 2.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([...])替换为FQCN,我想我可以更正确地继承约束。你有什么想法我怎么办?

1 个答案:

答案 0 :(得分:2)

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

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