Событие PostFlush
Событие PostFlush относится к событиям жизненного цикла EntityManager
и вызывается после того, как все изменения были сброшены в базу данных.
В отличие от OnFlush, это событие не получает аргумент EntityManager
напрямую, а работает через PostFlushEventArgs.
Событие полезно для выполнения действий, которые должны произойти
только после успешной записи в базу, например для отправки уведомлений
или записи в лог.
Синтаксис
use Doctrine\ORM\Event\PostFlushEventArgs;
public function postFlush(PostFlushEventArgs $args): void
{
}
Пример
Давайте создадим слушатель события PostFlush
и зарегистрируем его через атрибут AsDoctrineListener:
<?php
namespace App\EventListener;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Events;
#[AsDoctrineListener(event: Events::postFlush)]
class PostFlushListener
{
public function postFlush(PostFlushEventArgs $args): void
{
$em = $args->getObjectManager();
$count = count($em->getUnitOfWork()->getScheduledEntityInsertions());
echo 'postFlush: ' . $count;
}
}
?>
Результат выполнения кода при вставке одной сущности:
"postFlush: 1"
Пример
Давайте используем событие PostFlush для отправки уведомления
после сохранения статьи. Создадим сущность Article:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private string $title = '';
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;
}
}
?>
Теперь создадим слушатель, который после сброса отправит письмо об опубликованной статье:
<?php
namespace App\EventListener;
use App\Entity\Article;
use Doctrine\Bundle\DoctrineBundle\Attribute\AsDoctrineListener;
use Doctrine\ORM\Event\PostFlushEventArgs;
use Doctrine\ORM\Events;
#[AsDoctrineListener(event: Events::postFlush)]
class ArticlePostFlushListener
{
public function postFlush(PostFlushEventArgs $args): void
{
$em = $args->getObjectManager();
$uow = $em->getUnitOfWork();
foreach ($uow->getScheduledEntityInsertions() as $entity) {
if ($entity instanceof Article) {
echo 'Статья опубликована: ' . $entity->getTitle();
}
}
}
}
?>
Давайте сохраним статью через контроллер:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_create')]
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('article');
$em->persist($article);
$em->flush();
return new Response('saved');
}
}
?>
Результат выполнения кода:
Статья опубликована: article
Смотрите также
-
событие
PreFlush,
которое вызывается перед сбросом изменений -
событие
OnFlush,
которое позволяет изменить данные перед записью -
событие
PostPersist,
которое вызывается после вставки сущности -
событие
PostUpdate,
которое вызывается после обновления сущности