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

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