Symfony vich загрузчик доктрины и проблема расширения журнала? - PullRequest
1 голос
/ 28 июня 2019

Я использую эти две библиотеки для создания сущности, имеющей изображение, используя vich/uploader-bundle, и веду журнал истории изменений сущностей, используя расширение доктрины loggable, предоставленное stof/doctrine-extensions-bundle, который обеспечивает расширение от atlantic18/doctrineextensions.

Так вот в чем проблема: у меня есть объект, который имеет загружаемое поле изображения Vich, и он использует расширение журнала Gedmo от doctrine с аннотациями.

/**
 * @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;

А теперь проблема. Когда я загружаю файл и сохраняю сущность, происходит следующее. Менеджер сущностей сохраняет сущность, и вызывается метод onFlush регистрируемого прослушивателя Gedmo (Gedmo\Loggable\LoggableListener). Этот слушатель проверяет изменения и планирует записи в журнале для вставки.

Проблема в том, что 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 the LoggableListener` из-за того, что он вызывается первым и поэтому не знает, что они должны быть вставлены.

Мне не хватает какой-то конфигурации или я делаю что-то не так. Идея заключается в регистрации изменений, внесенных в изображение. На данный момент в базе данных записи журнала состоят только из поля $pictureUpdatedAt.

Я отладил проблему, и все, что я вижу, это порядок, и в LoggableListener метод getObjectChangeSetData возвращает только поле $pictureUpdatedAt, которое изменилось. Я не думаю, что это имеет что-то общее с сущностью Embedded, потому что я думаю, что порядок вызова слушателей является проблемой. Первая идея, которая у меня возникла, состояла в том, чтобы изменить приоритет слушателей, но даже если я это сделаю, порядок вызова не изменится главным образом потому, что при вызове onFlush он вызывает метод preUpdate, который запускает UploadListener загрузчика расслоение.

...