我有以下表单类型:
class ProjectStep1Type extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('client', new ClientType(), [
'label' => 'Client',
]);
// More fields
// Save as draft button
$builder->add('saveDraft', 'submit', [
'label' => 'Save as draft',
]);
// Actual submit button
$builder->add('validate', 'submit', [
'label' => 'Validate',
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$validationGroups = function(FormInterface $form) {
if ($form->get('saveDraft')->isClicked()) {
return ['Default', 'Draft'];
}
return ['Default', 'Step1'];
};
$resolver->setDefaults([
'data_class' => 'AppBundle\Entity\Project',
'validation_groups' => $validationGroups,
]);
}
}
(部分)验证 yaml 文件如下所示:
AppBundle\Entity\Client:
group_sequence:
- Client
- TypesOK
properties:
label:
- NotNull:
groups: [Step1]
- Type: string
- Length:
max: 255
groups: [TypesOK]
vatCode:
- NotNull:
groups: [Step1]
- Type:
type: string
contact:
- NotNull: ~
- Type: AppBundle\Entity\Contact
- Valid: ~
address:
- Type: AppBundle\Entity\Address
- Valid: ~
sector:
- NotNull:
groups: [Step1]
- Type: AppBundle\Entity\CompanySector
AppBundle\Entity\Project:
group_sequence:
- Project
- TypesOK
properties:
client:
- NotNull:
message: form.project.client.error.not_null
- Type: AppBundle\Entity\Client
- Valid: ~
status:
- NotNull: ~
- Type: string
- Choice:
choices: [DRAFT_1, DRAFT_2, DRAFT_3, SENT, REJECTED, DELETED]
groups: [TypesOK]
现在解决问题:当我验证表单时,Project
实体被正确验证,序列中的每个组一次,即[Project, TypesOK, Draft]
.
Client
但是,该实体使用Default
验证组进行验证。如果验证成功,则不会调用Default
组Client
和。TypesOK
但是,如果验证失败,则会调用这些组!并且我现在不希望看到的错误消息与使用Default
.
我期望的Client
是永远不会使用 验证Default
,而是将Default
组转换为组序列[Client, TypesOK]
,即使它通过Valid
约束。
我错过了什么吗?
编辑:
我在这方面取得了一些进展。我只有在编辑表单时才会出现验证问题。当我编辑表单时,使用代理类继承Client
而不是常规Client
类。
Doctrine 的正常功能。
但是,验证器元数据工厂不使用 parent 的组序列Client
。它获取其约束,但不获取此属性。
似乎这个问题与另一个问题非常接近,但是那里的解决方案对我不起作用。
这个问题现在对我来说似乎很清楚,但是我不知道应该如何正确解决这个问题。