Событие PrePersist
Событие PrePersist является частью механизма
жизненного цикла сущности (Lifecycle Callbacks) в Doctrine.
Оно срабатывает непосредственно перед тем, как новая
сущность будет впервые записана в базу данных. Это
событие позволяет автоматически заполнить поля, которые
должны быть установлены только один раз при создании
записи, например, дату создания или начальный статус.
Метод-обработчик не принимает аргументов и не должен
возвращать значение.
Синтаксис
Для использования события необходимо применить атрибут
PrePersist к методу внутри класса сущности. Также
на уровне класса обязателен атрибут
HasLifecycleCallbacks.
#[PrePersist]
public function methodName(): void
Пример
Давайте создадим сущность Article, которая будет
автоматически устанавливать дату создания при первой
записи в базу данных:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use DoctrineORMMappingHasLifecycleCallbacks;
use DoctrineORMMappingPrePersist;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
#[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;
#[PrePersist]
public function setCreatedAtValue(): void
{
$this->createdAt = new DateTimeImmutable();
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getCreatedAt(): DateTimeInterface
{
return $this->createdAt;
}
}
?>
Теперь при создании новой статьи дата создания установится автоматически. Проверим это в контроллере:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/create', name: 'article_create')]
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('article');
$em->persist($article);
$em->flush();
return new Response(
'Created at: ' . $article->getCreatedAt()->format('Y-m-d H:i:s')
);
}
}
?>
Результат выполнения кода:
Created at: 2024-01-15 10:30:00
Пример
Давайте также установим начальное значение для поля
status при создании сущности:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use DoctrineORMMappingHasLifecycleCallbacks;
use DoctrineORMMappingPrePersist;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
#[HasLifecycleCallbacks]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
#[ORMColumn(type: 'string', length: 255)]
private string $status;
#[ORMColumn(type: 'datetime')]
private DateTimeInterface $createdAt;
#[PrePersist]
public function setInitialValues(): void
{
$this->createdAt = new DateTimeImmutable();
$this->status = 'draft';
}
public function getStatus(): string
{
return $this->status;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
}
?>
Теперь при создании статьи поле status
автоматически получит значение 'draft'. Проверим
это:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/status', name: 'article_status')]
public function status(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('article');
$em->persist($article);
$em->flush();
return new Response('Status: ' . $article->getStatus());
}
}
?>
Результат выполнения кода:
Status: draft
Смотрите также
-
атрибут
HasLifecycleCallbacks,
который включает механизм событий жизненного цикла -
событие
PostPersist,
которое вызывается после сохранения сущности -
событие
PreUpdate,
которое вызывается перед обновлением сущности -
атрибут
Entity,
который помечает класс как сущность Doctrine