Symfony 如何在学说中正确使用postpdate、postmove、postPersist?

Symfony 如何在学说中正确使用postpdate、postmove、postPersist?,symfony,doctrine-orm,doctrine,Symfony,Doctrine Orm,Doctrine,文件说: 这三个post事件称为EntityManagerflush内部事件。此处的更改与数据库中的持久性无关,但您可以使用这些事件来更改非持久性项,如未映射的字段、日志记录,甚至是未直接映射的关联类 假设我有一个图像实体: 这是可行的,但正如文档所说,这不是一个好方法 我看过这篇帖子,上面写着: @iiirxs: 可以在PostPersist生命周期回调上调用flush来更改实体的映射属性 那么如何做到这一点呢@IIIRX和文档说明了两个不同的方面。下载postPersist事件的最佳方式是使

文件说:

这三个post事件称为EntityManagerflush内部事件。此处的更改与数据库中的持久性无关,但您可以使用这些事件来更改非持久性项,如未映射的字段、日志记录,甚至是未直接映射的关联类

假设我有一个图像实体:

这是可行的,但正如文档所说,这不是一个好方法

我看过这篇帖子,上面写着:

@iiirxs:

可以在PostPersist生命周期回调上调用flush来更改实体的映射属性


那么如何做到这一点呢@IIIRX和文档说明了两个不同的方面。

下载postPersist事件的最佳方式是使用


因此,您可以创建用于文件上载的异步任务,Symfony Messenger将能够处理错误并在失败时自动重试,您还可以更新它,状态等在单独的过程中,它将不取决于特定的原则案例,如您问题中的案例。

下载postPersist在此类事件上的内容的最佳方式是使用


因此,您可以创建用于文件上载的异步任务,Symfony Messenger将能够处理错误并在失败时自动重试,您还可以更新它,状态等在单独的过程中,它将不依赖于特定的原则案例,如您问题中的案例。

只有在实体保存第一次sql插入后才会触发postPersist,之后刷新只会触发sql更新,可能会替换idk,因此您不会得到无限循环;因此,首先应该从postPersit eventhandler中删除持久化调用。您可能不会得到循环,因为entityManager会找到实体并只更新它,但您肯定会让它做额外的事情。一旦实体被持久化,就不会再在该实体上触发postPersist事件,而只会触发postUpdates。所以你的解决方案应该是fineHi@zedling我知道它是有效的,我已经做过很多次了。问题是,条令告诉您不要这样做:>此处的更改与数据库中的持久性无关PostPersist仅在实体保存第一次sql插入后触发,之后刷新只会触发sql更新,可能会替换idk,因此不会得到无限循环;因此,首先应该从postPersit eventhandler中删除持久化调用。您可能不会得到循环,因为entityManager会找到实体并只更新它,但您肯定会让它做额外的事情。一旦实体被持久化,就不会再在该实体上触发postPersist事件,而只会触发postUpdates。所以你的解决方案应该是fineHi@zedling我知道它是有效的,我已经做过很多次了。问题是条令告诉您不要这样做:>这里的更改与数据库中的持久性无关
<?php
/**
 * @ORM\Entity
 */
class Image
{
    /**
     * @var int|null
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     * @ORM\Column(type="integer")
     */
    private ?int $id = null;

    /**
     * @var string
     * @ORM\Column(type="string")
     */
    private string $path;

    /**
     * @var string
     * @ORM\Column(type="string")
     */
    private string $status = 'RECEIVED';
}
<?php
public function postPersist(Image $image, LifecycleEventArgs $event)
{
    $em = $event->getEntityManager();
    try {
        $this->someService->uploadToFtp($image);
    } catch (Exception $e) {
        $image->setStatus('FTP_ERROR');
        $em->persist($image);
        $em->flush();
    }
}