symfony - 验证组不适用于集合类型
问题描述
所以我有一个包含表单集合的表单。我的父表单不包含表单类型类。我直接通过 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]但仍然没有触发验证。为什么呢?
谢谢!
解决方案
您所做的一切似乎都还不错,但我认为您错过了定义顶级表单验证组:
$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
)...
希望这可以帮助...
推荐阅读
- php - 通过 Curl 下载 .zip 的有趣问题,现在通过 Docker 容器。必须是标题等问题?
- javascript - 如何从material ui datagrid Row发送数据以形成输入?
- jenkins-pipeline - Jenkins 无法下载 Docker
- python - ReadTheDocs 问题:在 doc 文件夹之外导入文件
- python - 我试图为我的 discord.py 机器人设置一个清除/清除命令。没有错误,但是当我运行命令时,什么也没有发生
- angular - primeNg 密码中的 ToggleMask 不起作用
- python - 如何在 PyQt5 中创建循环和 AutoClosed 消息框?
- javascript - 如果我使用相机上传图片,文件上传失败
- hashicorp-vault - Vault 已初始化错误消息
- python - Python OpenCV 在 Canny 边缘检测后删除最外层边缘