Событие PostRemove
Событие PostRemove относится к жизненному циклу сущности
и вызывается Doctrine после того, как запись была удалена
из базы данных. Метод-обработчик помечается атрибутом
PostRemove и принимает один параметр -
EventArgs, через который можно получить доступ
к объекту сущности и EntityManager.
В отличие от PreRemove, данное событие срабатывает
уже после выполнения DELETE-запроса, поэтому изменения,
сделанные в обработчике, не повлияют на удалённую запись.
Синтаксис
#[PostRemove]
public function methodName(EventArgs $args): void
Пример
Давайте создадим сущность Article с обработчиком
события PostRemove, который логирует факт удаления:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use DoctrineORMEventLifecycleEventArgs;
use DoctrineORMMappingPostRemove;
#[ORMEntity]
#[ORMHasLifecycleCallbacks]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', 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;
}
#[PostRemove]
public function onPostRemove(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
echo 'Deleted article: ' . $entity->getTitle();
}
}
?>
Теперь удалим запись через EntityManager:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/delete', name: 'article_delete')]
public function delete(EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find(1);
$em->remove($article);
$em->flush();
return new Response('done');
}
}
?>
Результат выполнения кода:
"Deleted article: hello"
Пример
Давайте в обработчике PostRemove удалим связанный файл
после удаления сущности Article:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
use DoctrineORMEventLifecycleEventArgs;
use DoctrineORMMappingPostRemove;
#[ORMEntity]
#[ORMHasLifecycleCallbacks]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title = '';
#[ORMColumn(type: 'text', nullable: true)]
private ?string $filePath = null;
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 getFilePath(): ?string
{
return $this->filePath;
}
public function setFilePath(?string $filePath): self
{
$this->filePath = $filePath;
return $this;
}
#[PostRemove]
public function onPostRemove(LifecycleEventArgs $args): void
{
$entity = $args->getObject();
$file = $entity->getFilePath();
if ($file !== null && file_exists($file)) {
unlink($file);
echo 'File removed: ' . $file;
}
}
}
?>
Результат выполнения кода после удаления сущности:
"File removed: /uploads/article.txt"
Смотрите также
-
событие
PreRemove,
которое вызывается перед удалением записи -
событие
PostPersist,
которое вызывается после вставки записи -
событие
PostUpdate,
которое вызывается после обновления записи -
атрибут
HasLifecycleCallbacks,
который включает поддержку событий жизненного цикла