我正在使用这两个库来创建一个使用图片的实体,vich/uploader-bundle并且我正在使用loggable提供的学说扩展记录实体更改历史记录,该扩展stof/doctrine-extensions-bundle提供了atlantic18/doctrineextensions.
所以问题来了:我有一个实体,它有一个 Vich 可上传图片字段,它使用的是带有注释的学说的 Gedmo 可记录扩展。
/**
* @var VersionedFile
*
* @ORM\Embedded(class="App\Entity\Embedded\VersionedFile")
*
* @Gedmo\Versioned()
*/
private $picture;
/**
* @var File
*
* @Vich\UploadableField(
* mapping="user_picture",
* fileNameProperty="picture.name",
* size="picture.size",
* mimeType="picture.mimeType",
* originalName="picture.originalName",
* dimensions="picture.dimensions
* )
*/
private $pictureFile;
/**
* @var DateTimeInterface
*
* @ORM\Column(type="datetime", nullable=true)
*
* @Gedmo\Versioned()
*/
private $pictureUpdatedAt;
嵌入式实体类App\Entity\Embedded\VersionedFile具有所有需要的注释,以便使用可记录的学说扩展正确地进行版本控制。
// Not the whole code but just to get the idea for property versioning
/**
* @ORM\Column(name="name", nullable=true)
*
* @Gedmo\Versioned()
*/
protected $name;
现在的问题。当我上传文件并保留实体时,会发生以下事情。实体管理器持久化实体并调用 Gedmo 可记录侦听器 ( Gedmo\Loggable\LoggableListener)的 onFlush 方法。此侦听器检查更改并安排要插入的日志条目。
问题是 VichUploader s upload listener (Vich\UploaderBundle\EventListener\Doctrine\UploadListener ) is called after the loggable listener and then the file is uploaded which changes the properties name, size, etc. The computed changes about name, size, etc. are not available in theLoggableListener` 因为它首先被调用,所以它不知道应该插入它们。
我是缺少一些配置还是我做错了什么。这个想法是记录对图片所做的更改。目前在数据库中,日志条目仅包含$pictureUpdatedAt字段。
我调试了问题,我能看到的只是顺序,并且LoggableListener方法getObjectChangeSetData中只返回$pictureUpdatedAt已更改的字段。我认为这与 Embedded 实体没有共同之处,因为我认为听众的调用顺序是问题所在。我的第一个想法是更改侦听器的优先级,但即使我这样做,调用的顺序也不会改变,主要是因为在onFlush调用时它会触发preUpdate触发UploadListener上传程序包的方法。