Событие PostPersist
Событие PostPersist относится к жизненному циклу
сущности и вызывается после того, как новая запись была
вставлена в базу данных. Оно срабатывает через метод-слушатель,
отмеченный атрибутом PostPersist. В отличие от
PrePersist, здесь сущность уже имеет
сгенерированный идентификатор. Изменения, внесённые в
сущность внутри этого события, не попадут в текущий INSERT
автоматически и потребуют отдельного flush.
Синтаксис
#[PostPersist]
public function methodName(): void
Пример
Давайте создадим сущность Article и повесим на метод
слушатель события PostPersist, который выводит
идентификатор сохранённой записи:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use DoctrineORMMappingHasLifecycleCallbacks;
#[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')]
private DateTimeInterface $createdAt;
#[ORMPostPersist]
public function onPostPersist(): void
{
echo 'Saved article with id ' . $this->id;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function setCreatedAt(DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
}
?>
Теперь сохраним сущность через EntityManager:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('article');
$article->setCreatedAt(new DateTime());
$em->persist($article);
$em->flush();
return new Response('ok');
}
}
?>
Результат выполнения кода:
Saved article with id 1
Пример
Давайте в событии PostPersist запишем данные в
отдельную сущность лога. Так как сущность уже сохранена,
мы можем использовать её идентификатор:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use DoctrineORMMappingHasLifecycleCallbacks;
#[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: 'text', nullable: true)]
private ?string $log = null;
#[ORMPostPersist]
public function onPostPersist(): void
{
$this->log = 'Article ' . $this->id . ' was created';
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getLog(): ?string
{
return $this->log;
}
}
?>
После сохранения в свойстве log окажется строка:
"Article 1 was created"
Смотрите также
-
событие
PrePersist,
которое срабатывает перед сохранением сущности -
событие
PostUpdate,
которое срабатывает после обновления сущности -
атрибут
HasLifecycleCallbacks,
который включает события жизненного цикла у сущности -
атрибут
Entity,
который помечает класс как сущность Doctrine