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

Событие 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
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить