Symfony3忽略表单子项的validation.yml

Symfony3忽略表单子项的validation.yml,validation,symfony,Validation,Symfony,我不知道发生了什么,因为它过去是工作的,现在突然不工作了 因此,让我们从控制器开始: $user = new User(); $studio = new Studio(); $transformer = new StudioAccountDataTransformer($user, $studio); $form = $this->createForm(StudioAccountForm::class, $transforme

我不知道发生了什么,因为它过去是工作的,现在突然不工作了

因此,让我们从
控制器开始:

        $user = new User();
        $studio = new Studio();
        $transformer = new StudioAccountDataTransformer($user, $studio);
        $form = $this->createForm(StudioAccountForm::class, $transformer);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid())
        {
             // isValid always true
        }
现在是
StudioAccountForm

public function buildForm(FormBuilderInterface $builder, array $option)
{
    $builder
        ->add('user', UserType::class, [
            'label' => false
        ])
        ->add('studio', StudioType::class, [
            'label' => false
        ])
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'translation_domain'    => 'general',
        'data_class'            => 'AppBundle\Entity\DataTransformer\StudioAccountDataTransformer',
        'attr'                  => ['novalidate' => 'novalidate'],
        'cascade_validation'    => true,
        'validation_groups'     => ['Default', 'admin']
    ]);
}
UserType
(StudioType看起来很相似,没有什么特别之处)

StudioAccountDataTransformer
只是
studio
用户的getter/setter。
下面是
validation.yml

AppBundle\Entity\User:
    properties:
        firstName:
            - NotBlank:
                groups: [api, admin]
            - Length:
                min: 2
                max: 255
                groups: [api, admin]
        lastName:
            - NotBlank:
                groups: [api, admin]
            - Length:
                min: 2
                max: 255
                groups: [api, admin]  
config.yml

validation:      { enabled: true, enable_annotations: false }
如您所见,
StudioAccountForm
包含了另外两个表单,分别是
UserType
StudioType
,我应该从
UserType
中得到错误,因为
验证组
配置正确。此外,还启用了
cascade\u验证。不知何故,验证并没有以这种方式工作(我很确定它是工作的)

注意:如果我只将
UserType
放在
Controller
的createForm()函数中,那么有效性就起作用了。显然,
.yml
文件已加载

有什么想法吗?

我终于明白了

因此,从Symfony 2.8日志

The "cascade_validation" option was deprecated. Use the "constraints"
   option together with the `Valid` constraint instead. Contrary to
   "cascade_validation", "constraints" must be set on the respective child forms,
   not the parent form.
因此,我应该使用
Valid
约束,而不是使用
cascade\u验证,如下例所示

public function buildForm(FormBuilderInterface $builder, array $option)
{
    $builder
        ->add('user', UserType::class, [
            'label' => false,
            'constraints' => [
                new Valid()
            ]
        ])
        ->add('studio', StudioType::class, [
            'label' => false,
            'constraints' => [
                new Valid()
            ]
        ])
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'translation_domain'    => 'general',
        'data_class'            => 'AppBundle\Entity\DataTransformer\StudioAccountDataTransformer',
        'attr'                  => ['novalidate' => 'novalidate'],
        'validation_groups'     => ['Default', 'admin']
    ]);
}
我终于明白了

因此,从Symfony 2.8日志

The "cascade_validation" option was deprecated. Use the "constraints"
   option together with the `Valid` constraint instead. Contrary to
   "cascade_validation", "constraints" must be set on the respective child forms,
   not the parent form.
因此,我应该使用
Valid
约束,而不是使用
cascade\u验证,如下例所示

public function buildForm(FormBuilderInterface $builder, array $option)
{
    $builder
        ->add('user', UserType::class, [
            'label' => false,
            'constraints' => [
                new Valid()
            ]
        ])
        ->add('studio', StudioType::class, [
            'label' => false,
            'constraints' => [
                new Valid()
            ]
        ])
    ;
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'translation_domain'    => 'general',
        'data_class'            => 'AppBundle\Entity\DataTransformer\StudioAccountDataTransformer',
        'attr'                  => ['novalidate' => 'novalidate'],
        'validation_groups'     => ['Default', 'admin']
    ]);
}