Symfony 验证组不处理集合类型
所以我有一个包含表单集合的表单。我的父窗体不包含窗体类型类。我通过FormFactory likeso直接创建了它:Symfony 验证组不处理集合类型,symfony,Symfony,所以我有一个包含表单集合的表单。我的父窗体不包含窗体类型类。我通过FormFactory likeso直接创建了它: public function createBitcoinRateSettingForm() { $rateSettings = $this->em->getRepository(BitcoinRateSetting::class)->findRateSettings(); if (empty($rateSettings
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']);
如果所有内容都有效,则冲突集合将为空而不是空
希望这有帮助…嗨,如果我只想在设置集合的子集上应用验证怎么办?嗯,在这种情况下,我认为您不能真正依赖表单验证,但您必须与验证程序服务联系才能应用约束。用这个更新答案。。。