问题描述
我有一个 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。根据规范,这是不可能的。
解决方案
显示空文件上传输入。如果图片存在,则在模板的正下方将其显示给用户。这样用户就会知道图片已经上传了。
在控制器中检查用户是否通过您提交了任何内容。并且只有在有任何文件时才处理它。这需要将上传字段设置为mapped=false,您应该自己处理。
最重要的是,您可能应该添加用户删除图像的能力。但这取决于您的商业模式。