Я занимаюсь разработкой чата с использованием Ratchet PHP WebSockets.Проблема в том, что я использую Doctrine для слоя базы данных - и скрипт не перезагружается все время, как для обычных веб-запросов.
Поэтому я решил использовать $entityManager->clear()
для каждого соединения.(OnMessage) Теперь это работает все время, за исключением тех случаев, когда я хочу сохранить новые сущности с обычно новыми пользователями.
Вариант использования:
onMessage
:
/** @var \Doctrine\Bundle\DoctrineBundle\Registry $doctrine */
$doctrine = $this->container->get('doctrine');
$doctrine->getManager()->clear();
$user = $this->container->get(UserRepository::class)->find(1);
// checks for is enabled etc. works because user is always fresh from the database so
// if I disable him while the script is running it will be detected
Сохранение сущности с новой загрузкой данных из базы данных.
$user = $this->container->get(UserRepository::class)->find($subscriber->Session->get('user_id'));
if ($user) {
/** @var \Doctrine\Bundle\DoctrineBundle\Registry $doctrine */
$doctrine = $this->container->get('doctrine');
$doctrine->getManager()->refresh($user);
echo 'BEFORE ERROR' . PHP_EOL;
$chatMessageStatus = new ChatMessageStatus();
$chatMessageStatus->setUser($user);
$chatMessageStatus->setChatMessage($message);
$this->entityManager->persist($chatMessageStatus);
echo 'AFTER ERROR' . PHP_EOL;
}
Ошибка:
A new entity was found through the relationship 'App\Entity\ChatMessageStatus#user' that was not configured to cascade persist operations for entity: patrick. To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).
Я использую Symfony4 с Doctrine ORM2.5.
Заранее благодарим вас за любые идеи.