刷新后对对象执行任务



在我的项目中,我想在刷新后在 RabbitMq 上显示我的对象的 id,我该怎么做?因为,它出现在 postPersist 中,对象尚未刷新,而在 postFlush 中,我无法获取对象 ID。

public function prePersist(LifecycleEventArgs $args)
{
    $object = $args->getObject();
    if (!$object instanceof Blast) {
        return;
    }
    $token = $this->tokenGenerator->generateToken();
    $object->setName($token);
}
public function postPersist(LifecycleEventArgs $args)
{
    $object = $args->getObject();
    if (!$object instanceof Blast) {
        return;
    }
    // Publish in Messaging Queue
    $this->producer->publish($object->getId());
    // Set at last Blast in User session
    $this->session->set('last_blast', $object->getId());
}

有人有想法吗?我选择在下划线中执行此操作,否则,我在刷新后直接在控制器中添加 postPersist 部分?

要在 Doctrine 完成刷新后执行操作,您需要挂接到postFlush事件。它在刷新过程结束时触发一次,因此不包含任何关联实体。要解决此问题,您可以调度 RabbitMQ 消息,而不是立即发布它,postPersist然后"刷新"RabbitMQ 消息队列。在代码中,它会是这样的:

class MessagePublisher
{
    private $scheduled = [];
    public function postPersist(LifecycleEventArgs $args)
    {
        $object = $args->getObject();
        if (!$object instanceof Blast) {
             return;
        }
        $this->scheduled[] = $object->getId();
    }
    public function postFlush()
    {
        foreach ($this->scheduled as $id) {
             $this->producer->publish($id);
        }
        $this->scheduled = [];
    }
}

相关内容

  • 没有找到相关文章

最新更新