Symfony 3 - 在提交和验证后修改表单值

3
在我的应用程序中,我需要修改已提交并通过验证的表单值。
使用案例是一个带有地址的表单,该地址由外部Web服务进行可能的更正和验证。我需要在更正后更新表单中的地址,并在重新呈现的表单中通知用户。用户不应在更正后获得验证错误。
Symfony的表单组件不允许修改已提交的表单值,并引发AlreadySubmittedException异常。
一种解决方案是将更正后的地址传递给模板并添加逻辑。但这是我认为的错误方式。
还有其他解决方案吗?
提前感谢, Jens

嘿,你找到解决方案了吗?你是如何解决这个问题的?我也遇到了同样的问题。提前感谢你的反馈。 - undefined
请查看下一个答案的评论。 - undefined
1个回答

1

是的,你说得对,将更正后的值传递给模板不是正确的方法。

正确的方法是在表单中添加事件监听器,并在那里进行验证/更正值。

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class FooType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('address');

        $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
            $data = $event->getData();
            // do webservice validation here and
            $data = [];

            // set new data
            $event->setData($data);
        });
    }
}

更多信息请参阅文档


谢谢Airoude。不幸的是,我不能使用FormEvents::POST_SUBMIT监听器,因为a) 在此时尚未执行验证。但是我只能在验证之后通过实现在一个类约束中来更正地址,而b) 我会遇到一个AlreadySubmittedException异常。 - undefined
你可以设置一个较低的优先级,以便执行验证器。 - undefined
你尝试将监听器放置在子窗体中了吗? - undefined
是的。在我的子地址表单中,$event->getForm()->isValid()总是有效的,因为尚未执行验证。事实上,我的要求更加复杂。我的表单有几个子表单(用户),每个子表单都有一个地址子表单,并且我根据字段“有多少用户?”来进行验证。 - undefined
天哪,叫我白痴吧!我明白了。我只需要在自定义约束的验证方法中更改我的地址对象的属性,这是我与网络服务通信的地方。 - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接