Событие 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,
который включает события жизненного цикла в сущности