2

我有以下表单类型:

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验证组进行验证。如果验证成功,则不会调用DefaultClient和。TypesOK

但是,如果验证失败,则会调用这些组!并且我现在不希望看到的错误消息与使用Default.

我期望的Client是永远不会使用 验证Default,而是将Default组转换为组序列[Client, TypesOK],即使它通过Valid约束。

我错过了什么吗?

编辑:

我在这方面取得了一些进展。我只有在编辑表单时才会出现验证问题。当我编辑表单时,使用代理类继承Client而不是常规Client类。

Doctrine 的正常功能。

但是,验证器元数据工厂不使用 parent 的组序列Client。它获取其约束,但不获取此属性。

似乎这个问题与另一个问题非常接近,但是那里的解决方案对我不起作用。

这个问题现在对我来说似乎很清楚,但是我不知道应该如何正确解决这个问题。

4

1 回答 1

0

我看到的第一件事是,在您的AppBundle\Entity\Project客户端验证组中定义为ItalyBundle\Entity\Client但在客户端的验证组中AppBundle\Entity\Client正在使用。

于 2015-08-28T07:55:19.403 回答