结合答案并解决 VichUploader 的问题并在活动期间inject_on_load: true
更改。updatedAt
postLoad
问题说明
由于 Doctrine ORM 不监视 VichUploader 映射属性,因此您需要确保至少更改 ORM 管理的属性之一以触发VichUploader 用于管理文件引用的事件prePersist
。
这通常通过在文件设置器中使用 DATETIME 列来完成,但可以是由 ORM 管理的任何属性。preUpdate
updatedAt
postLoad
事件设置器File
实例问题
验证UploadedFile
提供给映射属性设置器方法的实例将确保仅在表单提交期间或手动提供时updatedAt
更改,而不是在事件期间更改 - 其中 VichUpload 为相同的映射设置器方法提供实例。如果您在 Doctrine 加载对象实例并因此对其进行管理时调用,这将导致视图中的值发生更改并可能更改数据库值。postLoad
File
updatedAt
$em::flush()
Image
应用\实体\图像
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* @ORM\Entity
* @Vich\Uploadable
*/
class Image
{
/**
* @var \DateTime
* @ORM\Column(name="updated_at", type="datetime")
*/
private $updatedAt;
/**
* @var \Symfony\Component\HttpFoundation\File\File
* @Vich\UploadableField(mapping="your_mapping", fileNameProperty="image")
*/
private $imageFile;
/**
* @var string|null
* @ORM\Column(name="image", type="string", length=255, nullable=true)
*/
private $image;
public function __construct()
{
$this->updatedAt = new \DateTime('now');
}
//...
public function setImageFile(File $image = null)
{
$this->imageFile = $image;
if ($image instanceof UploadedFile) {
$this->updatedAt = new \DateTime('now');
}
}
}
UploadedFile
然后,您可以通过实例化一个对象并将error
参数设置为null
并将test
参数设置为来手动定义要在实体中使用的文件true
,这将禁用验证UPLOAD_ERR_OK
和is_uploaded_file()
[sic]。
Symfony <= 4.0
use Symfony\Component\HttpFoundation\File\UploadedFile;
$file = new UploadedFile($path, $filename, null, filesize($path), null, true);
Symfony 4.1+
在 Symfony 4.1 及更高版本中,文件大小参数已被弃用。
use Symfony\Component\HttpFoundation\File\UploadedFile;
$file = new UploadedFile($path, $filename, null, null, true);
现在您可以使用手动上传的文件成功持久化和/或刷新您的实体。
$image = new Image();
$image->setImageFile($file);
$em->persist($image);
$em->flush();