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

Событие PreFlush

Событие PreFlush относится к жизненному циклу сущностей Doctrine и вызывается непосредственно перед операцией flush. Оно позволяет изменить состояние сущностей до того, как изменения будут записаны в базу данных. В отличие от PrePersist и PreUpdate, событие PreFlush не получает конкретную сущность в качестве аргумента, а работает с EntityManager через PreFlushEventArgs.

Синтаксис

#[PreFlush] public function methodName(PreFlushEventArgs $args): void

Пример

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

<?php namespace AppEntity; use DoctrineORMMapping as ORM; use DoctrineORMEventPreFlushEventArgs; use DoctrineORMMappingPreFlush; #[ORMEntity] #[ORMTable(name: 'articles')] class Article { #[ORMId] #[ORMGeneratedValue] #[ORMColumn(type: 'integer')] private ?int $id = null; #[ORMColumn(type: 'string', length: 255)] private string $title = ''; #[ORMColumn(type: 'text')] private string $text = ''; public function getId(): ?int { return $this->id; } public function getTitle(): string { return $this->title; } public function setTitle(string $title): self { $this->title = $title; return $this; } public function getText(): string { return $this->text; } public function setText(string $text): self { $this->text = $text; return $this; } #[PreFlush] public function onPreFlush(PreFlushEventArgs $args): void { if ($this->title === '') { $this->title = 'untitled'; } } } ?>

Теперь при сохранении сущности без заголовка поле title будет автоматически заполнено значением 'untitled':

<?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->setText('abcde'); $em->persist($article); $em->flush(); return new Response($article->getTitle()); } } ?>

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

untitled

Пример

Давайте используем PreFlush для обновления поля updatedAt у всех изменённых сущностей перед сбросом:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; use DoctrineORMEventPreFlushEventArgs; use DoctrineORMMappingPreFlush; #[ORMEntity] #[ORMTable(name: 'articles')] class Article { #[ORMId] #[ORMGeneratedValue] #[ORMColumn(type: 'integer')] private ?int $id = null; #[ORMColumn(type: 'string', length: 255)] private string $title = ''; #[ORMColumn(type: 'datetime')] private DateTimeInterface $updatedAt; public function __construct() { $this->updatedAt = new DateTime(); } public function getId(): ?int { return $this->id; } public function getTitle(): string { return $this->title; } public function setTitle(string $title): self { $this->title = $title; return $this; } public function getUpdatedAt(): DateTimeInterface { return $this->updatedAt; } #[PreFlush] public function onPreFlush(PreFlushEventArgs $args): void { $this->updatedAt = new DateTime(); } } ?>

Теперь при каждом flush поле updatedAt будет содержать актуальную дату и время:

<?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 = new Article(); $article->setTitle('article'); $em->persist($article); $em->flush(); return new Response($article->getUpdatedAt()->format('Y-m-d H:i:s')); } } ?>

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

2026-09-13 12:00:00

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

  • событие PrePersist,
    которое срабатывает перед сохранением новой сущности
  • событие PreUpdate,
    которое срабатывает перед обновлением сущности
  • событие OnFlush,
    которое срабатывает во время сброса изменений
  • событие PostFlush,
    которое срабатывает после сброса изменений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить