在我的项目中,我想在刷新后在 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 = [];
}
}