Php Symfony:自定义子窗体验证

Php Symfony:自定义子窗体验证,php,forms,validation,symfony,constraints,Php,Forms,Validation,Symfony,Constraints,我有一个表单巫婆使用自定义的非映射子表单 public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('subtype', 'my-subtype'); } } 子窗体由多个字段组成,我需要同时对这两个字段执行附加检查。回调约束非常适合该作业。但是,我找不到一种方法如何在整个子窗体上添加此约束 到目前为止,我已经尝试在setDefaultOpti

我有一个表单巫婆使用自定义的非映射子表单

public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder->add('subtype', 'my-subtype');
    }
}
子窗体由多个字段组成,我需要同时对这两个字段执行附加检查。回调约束非常适合该作业。但是,我找不到一种方法如何在整个子窗体上添加此约束

到目前为止,我已经尝试在setDefaultOptions()中设置回调,或者在buildForm()中使用setAttribute()设置回调,但是没有计算回调

目前,我只是将回调添加到其中一个字段:

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add('field1', 'text')
        ->add(
            'field2', 'text',
             array(
            'constraints' => array(
                new Callback(array(
                   'methods' => array(array($this, 'validateMyType'))
                ))
        )
    ));
}

public function validateMyType($data, ExecutionContextInterface $context) {
    // Validation failed...
    $context->addViolationAt('subtype', "mySubtypeViolation");
    return;
}

但是,这阻止我在整个子类型上添加冲突。无论我在addViolationAt()中使用什么,冲突总是添加到承载回调约束的字段中。

我很惊讶你不能在setDefaultOptions()中添加回调,因为我刚刚测试了这个,并且它可以工作。一开始我肯定会这么做

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'constraints' => new Callback([$this, 'test'])
    ]);
}

public function test($data, ExecutionContextInterface $context)
{
    return;
}

执行了
test
方法(我使用调试器进行了检查)。

首先,我在配置中输入了错别字,因此没有触发回调方法。其次,自动设置错误,以便将错误添加到整个表单中。所以我只需要手动禁用它

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults([
        'error_bubbling' => false, // Automatically set to true for compound forms.
        'constraints' =>
        array(
            new Callback(array(
                'methods' => array(array($this, 'validateMyType'))
                ))
    )]);
}
与任何其他回调一样,添加了冲突:

public function validateFacrMembership($data, ExecutionContextInterface $context) {
    $context->addViolation("invalidValueMessage");
}

好啊这是我的错。我的默认值声明不正确(“'constraints',array(…”)。无论如何,我仍然需要弄清楚如何将冲突添加到其字段和整个子窗体。您需要使用冲突的属性路径。
$context->buildinvalition(…)->atPath('subtype')
应该可以做到这一点。