【发布时间】:2019-12-27 20:16:50
【问题描述】:
我正在开发我的模块,其中一部分是您可以向数据库添加新背景以在幻灯片中使用。
我有一个具有 3 个属性的 SlideshowBackground 实体:
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=150)
*/
private $image;
/**
* @ORM\Column(type="string", length=100)
*/
private $imageAlt;
而且基本上,图片就是上传文件的字符串,包括相对路径。
我有以下SlideshowBackgroundType 作为添加幻灯片背景页面的表单:
class SlideshowBackgroundType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('image', FileType::class, [
'required' => true
]);
$builder->add('imageAlt', TextType::class, ['required' => true]);
}
}
但是,如果我提交表单并检查$form->getData(),它包含以下数据:
SlideshowBackground {#419 ▼
-id: null
-image: "C:\wamp64\tmp\php5B96.tmp"
-imageAlt: "ty"
}
但是,这样我无法获取原始上传的文件名。我在控制器中使用以下代码:
$slideshowBackground = new SlideshowBackground();
$form = $this->createForm(SlideshowBackgroundType::class, $slideshowBackground);
$form->handleRequest($request);
如何使用SlideshowBackground 实体,同时还能上传未直接映射到image 的文件?
我尝试将我的 image 字段修改为以下内容:
$builder->add('image', FileType::class, [
'required' => false,
'mapped' => false
]);
然后我从$form->getData() 得到相同的结果,但是image 列为空。
另外,当我尝试使用最后一个代码提交时,image 上出现以下错误:
This value should not be null.
我知道SlideshowBackground 中的image 属性是必需的,而且应该是,但它不起作用,因为使用mapped => false 提交时未定义image。有什么办法可以解决这个问题?
【问题讨论】:
-
查看docs example中的控制器代码。请务必过滤 getClientOriginalName() 的结果,因为它可能是攻击媒介。
-
@Cerad 我确实看过那里,但我还是无法弄清楚,因为它会带来额外的问题。我的表单使用我的实体,它有一个属性
image,这是必需的,并且由于提交时它为空,它会引发错误。但是,AFAIK 应该需要image,因为背景需要指定图像。 -
没关系,我发现我的愚蠢,我得到了正确的数据,我发现了问题。还是谢谢
-
是否与未设置映射为false有关?只是好奇。
-
其实行不通。我将表单生成器中的
image输入更改为imageupload,它确实添加了一个新的未映射输入类型。但是,我的表单不起作用,因为SlideshowBackground实体中的image为 null,这是不可能发生的。因此,$form->isSubmitted() && $form->isValid()将返回 false。我只检测到我在查看$form->getData并且只返回实体(而不是额外的字段)。所以我可以从表单中获取上传的图片,但我无法提交表单
标签: forms symfony file-upload symfony4