Symfony 验证组不处理集合类型

Symfony 验证组不处理集合类型,symfony,Symfony,所以我有一个包含表单集合的表单。我的父窗体不包含窗体类型类。我通过FormFactory likeso直接创建了它: public function createBitcoinRateSettingForm() { $rateSettings = $this->em->getRepository(BitcoinRateSetting::class)->findRateSettings(); if (empty($rateSettings

所以我有一个包含表单集合的表单。我的父窗体不包含窗体类型类。我通过FormFactory likeso直接创建了它:

public function createBitcoinRateSettingForm()
    {
        $rateSettings = $this->em->getRepository(BitcoinRateSetting::class)->findRateSettings();

        if (empty($rateSettings)) {
            $rateSetting = new BitcoinRateSetting();
            $rateSetting->setIsDefault(true);
            $rateSettings[] = $rateSetting;
        }

        $bitcoinRateSettingForm = $this->formFactory->createBuilder()
            ->add('settings', CollectionType::class, [
                'entry_type' => BitcoinRateSettingType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'label' => false,
                'by_reference' => false,
                'constraints' => [
                    new Valid(),
                ],

            ])
            ->getForm()
        ;

        $bitcoinRateSettingForm->get('settings')->setData($rateSettings);

        return $bitcoinRateSettingForm;
    }
下面是我的BitcoinRateSettingType定义:

class BitcoinRateSettingType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {   
        $builder
            ->add('rangeFrom', Type\TextType::class)
            ->add('rangeTo', Type\TextType::class)
            ->add('amountInEuros', Type\TextType::class)
            ->add('percentageAmountInEuros', Type\TextType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {   
        $resolver->setDefaults([
            'data_class' => BitcoinRateSetting::class,
            'validation_groups' => ['bitcoinRateDefault']
        ]);
    }
}
这是我的确认

DbBundle\Entity\BitcoinRateSetting:
    properties:
        rangeTo:
            - NotBlank: 
                message: "Range to should not be blank."
                groups: [bitcoinRateDefault]
            - NotNull:  
                message: "Range to should not be blank."
                groups: [bitcoinRateDefault]
        rangeFrom:
            - NotBlank: 
                message: "Range from should not be blank."
                groups: [bitcoinRateDefault]
            - NotNull: 
                message: "Range from should not be blank."
                groups: [bitcoinRateDefault]
如您所见,我将默认验证组设置为[bitcoinRateDefault],但仍然没有触发验证。为什么会这样


谢谢

您需要在formtype中启用级联验证:

$resolver->setDefaults([
    'data_class' => BitcoinRateSetting::class,
    'validation_groups' => ['bitcoinRateDefault'],
    'cascade_validation' => true,
]);

您所做的一切似乎都很正常,但我认为您没有定义顶级表单验证组:

$bitcoinRateSettingForm = $this->formFactory->createBuilder(null, 
        [ 
            'validation_groups' => ['bitcoinRateDefault']
        ])
        // The rest of of your code...
        ->add('settings', CollectionType::class, [
上面的第一个参数null表示初始数据,因此您不妨在此处以以下形式传递$rateSettings:

['settings' => $rateSettings]
更新: 如果只想验证表单的设置子集,则需要直接与验证程序服务联系:

如果这是一个symfony3.1+我想,在您的控制器/服务中插入Validator接口。如果这是Symfony 3.0-,则需要通过get调用从容器中获取验证器。一旦你做到了,你可以:

$settings = $form->get('settings')->getData();
$violations = $validator->validate($settings, ['bitcoinRateDefault']);
如果所有内容都有效,则冲突集合将为空而不是空


希望这有帮助…

嗨,如果我只想在设置集合的子集上应用验证怎么办?嗯,在这种情况下,我认为您不能真正依赖表单验证,但您必须与验证程序服务联系才能应用约束。用这个更新答案。。。