首页 > 解决方案 > 验证组不适用于集合类型

问题描述

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

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

这是我的validation.yml

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]但仍然没有触发验证。为什么呢?

谢谢!

标签: symfony

解决方案


您所做的一切似乎都还不错,但我认为您错过了定义顶级表单验证组:

$bitcoinRateSettingForm = $this->formFactory->createBuilder(null, 
        [ 
            'validation_groups' => ['bitcoinRateDefault']
        ])
        // The rest of of your code...
        ->add('settings', CollectionType::class, [

第一个参数(null上面的)代表初始数据,所以你不妨在$rateSettings这里传递,而不是形式:

['settings' => $rateSettings]

更新:

如果您只想验证settings表单的子集,则需要validator直接与服务“交谈”:

如果这是 Symfony 3.1+(我认为),请注入ValidatorInterface您的控制器/服务。如果这是 Symfony 3.0-,您需要通过调用validator从您的容器中获取。get()一旦你这样做,你可以:

$settings = $form->get('settings')->getData();
$violations = $validator->validate($settings, ['bitcoinRateDefault']);

如果一切都有效,则violations集合将为空(不是null)...

希望这可以帮助...


推荐阅读