Событие 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,
который включает события жизненного цикла