Атрибут HasLifecycleCallbacks
Атрибут HasLifecycleCallbacks вешается на класс
сущности и сообщает Doctrine, что в этом классе нужно
искать методы жизненного цикла. Такие методы помечаются
атрибутами событий: PrePersist, PostPersist,
PreUpdate, PostUpdate, PreRemove,
PostRemove, PostLoad, PreFlush.
Без этого атрибута Doctrine не будет вызывать методы
жизненного цикла при работе с сущностью.
Синтаксис
#[HasLifecycleCallbacks]
class Entity
{
#[PrePersist]
public function methodName(): void
{
}
}
Пример
Давайте создадим сущность Article с полями
title и createdAt. При сохранении сущности
метод setCreatedAt автоматически проставит дату создания:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\HasLifecycleCallbacks]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(type: 'string')]
private string $title;
#[ORM\Column(type: 'datetime')]
private \DateTimeInterface $createdAt;
public function getId(): ?int
{
return $this->id;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getTitle(): string
{
return $this->title;
}
public function getCreatedAt(): \DateTimeInterface
{
return $this->createdAt;
}
#[ORM\PrePersist]
public function setCreatedAt(): void
{
$this->createdAt = new \DateTime();
}
}
?>
Теперь при сохранении сущности через EntityManager
метод setCreatedAt вызовется автоматически:
<?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($article->getCreatedAt()->format('Y-m-d'));
}
}
?>
Результат выполнения кода:
"2024-01-01"
Пример
Давайте добавим метод setUpdatedAt, который будет
обновлять дату изменения при каждом обновлении сущности:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\HasLifecycleCallbacks]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(type: 'string')]
private string $title;
#[ORM\Column(type: 'datetime')]
private \DateTimeInterface $createdAt;
#[ORM\Column(type: 'datetime')]
private \DateTimeInterface $updatedAt;
public function getId(): ?int
{
return $this->id;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getTitle(): string
{
return $this->title;
}
public function getCreatedAt(): \DateTimeInterface
{
return $this->createdAt;
}
public function getUpdatedAt(): \DateTimeInterface
{
return $this->updatedAt;
}
#[ORM\PrePersist]
public function setCreatedAt(): void
{
$this->createdAt = new \DateTime();
}
#[ORM\PreUpdate]
public function setUpdatedAt(): void
{
$this->updatedAt = new \DateTime();
}
}
?>
Теперь при обновлении заголовка сущности метод
setUpdatedAt обновит дату изменения:
<?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/update/{id}', name: 'article_update')]
public function update(int $id, EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find($id);
$article->setTitle('updated');
$em->flush();
return new Response($article->getUpdatedAt()->format('Y-m-d'));
}
}
?>
Результат выполнения кода:
"2024-01-01"
Смотрите также
-
атрибут
Entity,
который помечает класс как сущность Doctrine -
атрибут
PrePersist,
который вызывает метод перед сохранением сущности -
атрибут
PreUpdate,
который вызывает метод перед обновлением сущности -
атрибут
PostLoad,
который вызывает метод после загрузки сущности