我有一个表单,其中还包含文件类型的输入。这个表单连接到一个实体,就像它在官方的Symfony教程中所做的那样,创建了一个“表单类型”来连接一个实体和一个表单。
每当我需要通过其表单更新实体时,我遇到了问题,主要是因为输入文件。
这个想法只是为了让用户最终上传一个新文件(不涉及以前上传的文件,即旧文件不应该以某种方式返回给客户端,也因为我不知道该怎么做它在这种环境/情况下......)。
然后,在控制器中,我可以检查用户是否上传了新文件,如果是,那么我可以删除旧文件。如果没有,我应该重置存储上传文件名称的字段作为“旧”文件的名称。在这两种情况下,我都需要在返回表单以编辑实体之前跟踪“当前”文件的名称。我通过将其存储在会话中来完成此操作。
我不知道这个想法有多好或多坏,也许是因为在阅读了这么多篇文章后,关于会议我仍然对它们没有一个清晰的认识。我知道这是一种使HTTP请求满状态的方法,但我仍然不清楚实现,即发生了什么事情。
会话也可以被清除或终止,但我不知道在哪种情况下。所以,我不知道在会话中存储旧/当前文件的名称有多危险或有风险。
你能解释为什么它是好主意还是坏主意?如果一个坏主意,什么是更好的选择?
如果您有兴趣,这是相应的相关代码:
...
// store old brochure in the session,
// so that if the user doesn't upload a new file
// we use the old file
if(isset($product) && $request->isMethod('GET')) {
$this->get('session')->set($product->getId(), $product->getBrochure());
}
$editForm = $this->createForm(ProductType::class, $product, ['brochure_required' => false]);
$editForm->handleRequest($request);
// remove previous file if a new file was uploaded
if($request->isMethod('POST')) {
if(isset($request->files->get('product')['brochure'])) {
$filePathToDelete = $this->getParameter('brochures_directory') . '/' . $this->get('session')->get($product->getId());
if(is_file($filePathToDelete)) {
unlink($filePathToDelete);
}
} else {
$product->setBrochure($this->get('session')->get($product->getId()));
}
$this->get('session')->remove($product->getId());
}
...