Доктрина с всегда живыми данными из базы данных / очистка разрушает все / Ratchet chat - PullRequest
0 голосов
/ 24 мая 2018

Я занимаюсь разработкой чата с использованием 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.

Заранее благодарим вас за любые идеи.

...