Событие PostLoad
Событие PostLoad срабатывает после того,
как Doctrine загрузила сущность из базы данных
и заполнила её поля. Обработчик этого события
позволяет выполнить дополнительную логику над
уже загруженным объектом: вычислить производные
значения, нормализовать данные, подгрузить
связанные данные. Обработчик регистрируется
через атрибут HasLifecycleCallbacks
на классе сущности и метод с атрибутом
PostLoad.
Синтаксис
#[PostLoad]
public function methodName(): void
Пример
Давайте создадим сущность Article
и повесим на метод обработчик события
PostLoad, который формирует краткое
описание статьи:
<?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 = '';
#[ORMColumn(type: 'text')]
private string $text = '';
private string $excerpt = '';
#[ORMPostLoad]
public function buildExcerpt(): void
{
$this->excerpt = mb_substr($this->text, 0, 20);
}
public function getExcerpt(): string
{
return $this->excerpt;
}
}
?>
Теперь при загрузке статьи из базы данных
поле excerpt будет заполнено
автоматически:
<?php
namespace AppController;
use AppEntityArticle;
use DoctrineORMEntityManagerInterface;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function show(EntityManagerInterface $em): Response
{
$article = $em->getRepository(Article::class)->find(1);
return new Response($article->getExcerpt());
}
}
?>
Результат выполнения кода:
"abcde"
Пример
Давайте в обработчике PostLoad
нормализуем строковое поле и приведём его
к нижнему регистру:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
#[ORMHasLifecycleCallbacks]
class User
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string')]
private string $name = '';
#[ORMPostLoad]
public function normalizeName(): void
{
$this->name = mb_strtolower($this->name);
}
public function getName(): string
{
return $this->name;
}
}
?>
Результат выполнения кода для пользователя
с именем 'ABCDE' в базе данных:
"abcde"
Пример
Давайте в обработчике PostLoad
заполним булево поле на основе другого поля:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
#[ORMHasLifecycleCallbacks]
class Product
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'integer')]
private int $quantity = 0;
private bool $inStock = false;
#[ORMPostLoad]
public function checkStock(): void
{
$this->inStock = $this->quantity > 0;
}
public function isInStock(): bool
{
return $this->inStock;
}
}
?>
Результат выполнения кода для товара
с количеством 5:
true
Смотрите также
-
атрибут
HasLifecycleCallbacks,
который включает lifecycle-события для сущности -
событие
PostPersist,
которое вызывается после сохранения сущности -
событие
PostUpdate,
которое вызывается после обновления сущности -
событие
PostRemove,
которое вызывается после удаления сущности