РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
128 of 258 menu

Событие PostUpdate

Событие PostUpdate относится к жизненному циклу сущности Doctrine и вызывается после того, как изменённая сущность была обновлена в базе данных. Обработчик вешается на метод сущности через атрибут HasLifecycleCallbacks. Событие не имеет параметров и не получает EntityManager, поэтому внутри метода нельзя выполнять запросы к базе. Событие удобно использовать для логирования, отправки уведомлений или обновления связанных данных в памяти.

Синтаксис

#[HasLifecycleCallbacks] class SomeEntity { #[PostUpdate] public function someMethod(): void { // ... } }

Пример

Давайте создадим сущность Article с обработчиком события PostUpdate, который записывает в поле updatedAt текущую дату:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; use DoctrineORMMappingHasLifecycleCallbacks; use DoctrineORMMappingPostUpdate; #[ORMEntity] #[ORMTable(name: 'articles')] #[HasLifecycleCallbacks] class Article { #[ORMId] #[ORMGeneratedValue] #[ORMColumn(type: 'integer')] private ?int $id = null; #[ORMColumn(type: 'string', length: 255)] private string $title = ''; #[ORMColumn(type: 'datetime', nullable: true)] private ?DateTimeInterface $updatedAt = null; #[PostUpdate] public function setUpdatedAt(): void { $this->updatedAt = new DateTimeImmutable(); } public function getId(): ?int { return $this->id; } public function getTitle(): string { return $this->title; } public function setTitle(string $title): void { $this->title = $title; } public function getUpdatedAt(): ?DateTimeInterface { return $this->updatedAt; } } ?>

Теперь обновим сущность через EntityManager и вызовем flush:

<?php namespace AppController; use AppEntityArticle; use DoctrineORMEntityManagerInterface; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class ArticleController extends AbstractController { #[Route('/article/update', name: 'article_update')] public function update(EntityManagerInterface $em): Response { $article = $em->getRepository(Article::class)->find(1); $article->setTitle('abcde'); $em->flush(); return new Response($article->getUpdatedAt()->format('Y-m-d H:i:s')); } } ?>

Результат выполнения кода:

"2024-01-01 12:00:00"

Пример

Давайте в обработчике PostUpdate увеличим счётчик обновлений сущности:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; use DoctrineORMMappingHasLifecycleCallbacks; use DoctrineORMMappingPostUpdate; #[ORMEntity] #[ORMTable(name: 'articles')] #[HasLifecycleCallbacks] class Article { #[ORMId] #[ORMGeneratedValue] #[ORMColumn(type: 'integer')] private ?int $id = null; #[ORMColumn(type: 'string', length: 255)] private string $title = ''; #[ORMColumn(type: 'integer')] private int $updateCount = 0; #[PostUpdate] public function incrementUpdateCount(): void { $this->updateCount++; } public function getId(): ?int { return $this->id; } public function getTitle(): string { return $this->title; } public function setTitle(string $title): void { $this->title = $title; } public function getUpdateCount(): int { return $this->updateCount; } } ?>

Обновим сущность и выведем количество обновлений:

<?php namespace AppController; use AppEntityArticle; use DoctrineORMEntityManagerInterface; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentRoutingAttributeRoute; class ArticleController extends AbstractController { #[Route('/article/count', name: 'article_count')] public function count(EntityManagerInterface $em): Response { $article = $em->getRepository(Article::class)->find(1); $article->setTitle('user'); $em->flush(); return new Response((string) $article->getUpdateCount()); } } ?>

Результат выполнения кода:

"1"

Смотрите также

  • событие PreUpdate,
    которое срабатывает перед обновлением сущности
  • событие PostPersist,
    которое срабатывает после вставки сущности
  • событие PostRemove,
    которое срабатывает после удаления сущности
  • атрибут HasLifecycleCallbacks,
    который включает события жизненного цикла
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить