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

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