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

Событие PreRemove

Событие PreRemove относится к жизненному циклу сущности и вызывается Doctrine перед выполнением операции удаления. Обработчик получает доступ к сущности через метод getEntity и может выполнить дополнительные действия, например, удалить связанные файлы или записать лог.

Событие можно перехватить двумя способами: через #[HasLifecycleCallbacks] и метод внутри сущности либо через #[AsDoctrineListener] и отдельный класс-слушатель.

Синтаксис

#[PreRemove] public function methodName(): void

Пример

Давайте создадим сущность Article с обработчиком события PreRemove:

<?php namespace AppEntity; use DoctrineORMMapping as ORM; #[ORMEntity] #[ORMHasLifecycleCallbacks] class Article { #[ORMId] #[ORMGeneratedValue] #[ORMColumn(type: 'integer')] private ?int $id = null; #[ORMColumn(type: 'string')] private string $title = ''; #[ORMPreRemove] public function preRemove(): void { echo 'Removing article: ' . $this->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; } } ?>

Теперь удалим сущность через EntityManager:

<?php namespace AppController; use AppEntityArticle; use DoctrineORMEntityManagerInterface; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; class ArticleController extends AbstractController { public function remove(EntityManagerInterface $em): Response { $article = new Article(); $article->setTitle('abcde'); $em->persist($article); $em->flush(); $em->remove($article); $em->flush(); return new Response('done'); } } ?>

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

"Removing article: abcde"

Пример

Давайте вынесем обработчик в отдельный класс-слушатель с атрибутом #[AsDoctrineListener]:

<?php namespace AppEventListener; use AppEntityArticle; use DoctrineORMEvents; use DoctrineORMEventPreRemoveEventArgs; use SymfonyComponentEventDispatcherAttributeAsEventListener; #[AsEventListener(event: Events::preRemove)] class ArticleRemoveListener { public function __invoke(PreRemoveEventArgs $args): void { $entity = $args->getObject(); if (!$entity instanceof Article) { return; } echo 'Listener: ' . $entity->getTitle(); } } ?>

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

"Listener: abcde"

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

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