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')
应该可以做到这一点。