缺少从 FormEvents PRE_SUBMIT 到 SUBMIT 侦听器的数据

问题描述

我有一个 Symfony 4 表单,我想在其中操作字段的值。

我附加了更多的侦听器:PRE_SET_DATA、PRE_SUBMIT 和 SUBMIT(最后一个仅用于验证目的)。

更准确地说,它是一个修改表单中的文件上传者字段,所以如果用户留空,那么我想使用之前的值(没有变化)。

$builder->addEventListener(FormEvents::PRE_SET_DATA,function (FormEvent $event) {
  $data = $event->getData();
  $event->getForm()->get('picture')->setData($data->getPicture());

在上面的例子中,我用存储的值(来自实体)设置了字段的值,这是有效的

$builder->addEventListener(FormEvents::PRE_SUBMIT,function (FormEvent $event) {
  $data = $event->getData();  // array
  $entity = $event->getForm()->getData();
  if (empty($data['picture']) && !empty($entity)) {
    $data['picture'] = $entity->getPicture();
    $event->setData($data);
  }

dumping $event 仍然包含数据,到目前为止还好。

   $builder->addEventListener(FormEvents::SUBMIT,function (FormEvent $event) {
      dump($event);
    });

但是 SUBMIT 事件忘记了所有,此时我无法添加它。

目标是设置 picture 字段的值,使其朝向 SUBMIT 而不会消失。

解决方法

我的假设是 FileType 故意在事件之间删除您的数据。这是因为 FileType 期望来自类型的用户对象:

Symfony\Component\HttpFoundation\File\UploadedFile

但您的实体中可能只有文件名,而不是此对象。这就是它被忽略的原因。

最重要的是,您不能使用来自服务器的数据预填充 HTML。根据规范,这是不可能的。

解决方案

显示空文件上传输入。如果图片存在,则在模板的正下方将其显示给用户。这样用户就会知道图片已经上传了。

在控制器中检查用户是否通过您提交了任何内容。并且只有在有任何文件时才处理它。这需要将上传字段设置为ma​​pped=false,您应该自己处理。

最重要的是,您可能应该添加用户删除图像的能力。但这取决于您的商业模式。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...