У меня есть класс Listener, который при создании сообщения или объекта темы обновляет эти поля в таблице категорий:
last_post_thread_title
last_post_thread_slug
last_poster_username
last_post_body
last_post_created_at
is_last_post_op
и last_post_created_at
в таблице потоков.
class LastPostListener
{
public function postPersist(LifeCycleEventArgs $args)
{
$entity = $args->getObject();
$entityManager = $args->getObjectManager();
$this->handleEvent($entityManager, $entity);
}
public function postUpdate(LifeCycleEventArgs $args)
{
$entity = $args->getObject();
$entityManager = $args->getObjectManager();
$this->handleEvent($entityManager, $entity);
}
public function handleEvent($entityManager, $entity)
{
if (!$entity instanceof Post && !$entity instanceof Thread) {
return;
}
$isPost = $entity instanceof Post;
$thread = $isPost ? $entity->getThread() : $entity;
$post = $isPost ? $entity : $thread;
$category = $thread->getCategory();
$category->setLastPostThreadTitle($thread->getTitle());
$category->setLastPostThreadSlug($thread->getSlug());
$category->setLastPostBody($post->getBody());
$category->setLastPosterUsername($post->getUser()->getUsername());
$category->setLastPostCreatedAt($post->getCreatedAt());
$category->setIsLastPostOp(!$isPost);
$thread->setLastPostCreatedAt($entity->getCreatedAt());
$entityManager->persist($thread, $category);
$entityManager->flush();
}
}
Однако, когда EXISTING Thread или Post Entity редактируются, ранее упомянутые поля таблицы Category не обновляются.
То же самое с событиями prePersist () и preUpdate (), с или без очистки.
Конечно, можно добавить все строки $category->set
непосредственно в контроллер update
функция, но она грязная.
Какое событие следует использовать здесь или, может быть, есть какое-то другое решение?Спасибо