gpt4 book ai didi

php - Symfony Doctrine EntityManager 没有正确刷新

转载 作者:行者123 更新时间:2023-12-05 04:33:46 25 4
gpt4 key购买 nike

我有一个 Ratchet WebSocket 服务器,它的 entityManager 是从后端初始化的。但是,如果由于 WebSocket 服务器的 entityManager 状态与后端不同,其中一个前端发生了某些更改,则新更改不会反射(reflect)在由 WebSocket 服务器提供的数据中WebSocket 服务器。

为此,我在后端编写了一些监听器,用于监听这些实体中的更改,然后向服务器发送请求,如下所示:

public function postUpdate(Room $entity, LifecycleEventArgs $_)
{
try {
Loop::run(function() use ($entityName, $id) {
$conn = yield connect('ws://localhost:8080');
yield $conn->send(json_encode(['message' => $entityName, 'data' => ['duid' => $id]]));
$conn->close();});
} catch (Exception $e) {}
}

然后我在 WebSocket 服务器中获取实体并简单地刷新它,如下所示:

function onMessage(ConnectionInterface $from, $msg)
{
try {
$messageData = json_decode($msg);
switch ($messageData->message) {
case BookingSocketActions::ROOM_CHANGED_EVENT:
// $room = $this->entityManager->getRepository('ResourcesBundle:Room')
// ->find(['id' => $id]);
$room = $this->entityManager->getRepository('ResourcesBundle:Room')
->findRoomDetailById($messageData->data->duid);
// $this->entityManager->clear();
$this->entityManager->refresh($room);
break;
}
} catch (Exception $ex) {
$from->send($ex);
}
}

现在出现了一个奇怪的错误:在 WebSocket 服务器中刷新的 $entity 的状态总是落后于实体的真实变化。假设我将 $entity->name 从“1”更改为“2”。

刷新后 $entity->name 在 WebSocket 服务器上仍然是“1”。只有当我再次将其更改为其他内容时,例如“3”,会不会变成“2”(刷新后)。如果我将其更改为“4”,它将转到“3”,依此类推。

事件从后端正确触发,并且在服务器上正确获取实体。只是 refresh() 仅适用于对 WebSocket 服务器的第二次请求(因此是第二次刷新),而不适用于第一次请求。

我什至尝试过 $entityManager->merge($entity); 但没有结果。

我在使用 symfony 3.4、doctrine 2.7 和 ratchet 0.4.3。

最佳答案

首先可能是触发检测更新变化的事件。

如果您postPersist 实体将不会在数据库中更改。它会在 flush 发生之前触发。

您需要在 flush 之后 触发消息到套接字服务器。

第二件事是确保 entityManager 实例分离并重新加载 room 实体实例。这可以用

$this->entityManager->getUnitOfWork()->clear(Room::class);

就在您再次查询实体之前

$this->entityManager->getUnitOfWork()->clear(Room::class);
$room = $this->entityManager
->getRepository('ResourcesBundle:Room')
->findRoomDetailById($messageData->data->duid);

关于php - Symfony Doctrine EntityManager 没有正确刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71337399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com