Событие 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,
которое срабатывает после сброса изменений