Событие LoadClassMetadata
Событие LoadClassMetadata относится к жизненному циклу
Doctrine и вызывается после того, как Doctrine загрузит
метаданные класса сущности. Подписчик этого события
получает объект LoadClassMetadataEventArgs, из
которого можно получить ClassMetadata и изменить
его: добавить поля, изменить связи, задать индексы или
настроить наследование. Событие удобно для
динамической настройки метаданных без правки самой
сущности.
Синтаксис
use DoctrineORMEventLoadClassMetadataEventArgs;
public function loadClassMetadata(LoadClassMetadataEventArgs $args): void
{
$metadata = $args->getClassMetadata();
}
Пример
Давайте создадим подписчик, который добавляет
новое поле string к сущности Article:
<?php
namespace AppEventListener;
use AppEntityArticle;
use DoctrineORMEventLoadClassMetadataEventArgs;
class LoadClassMetadataListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $args): void
{
$metadata = $args->getClassMetadata();
if ($metadata->getName() !== Article::class) {
return;
}
if (!$metadata->hasField('slug')) {
$metadata->mapField([
'fieldName' => 'slug',
'type' => 'string',
'nullable' => true,
]);
}
}
}
?>
Теперь зарегистрируем подписчик в конфигурации
сервисов с тегом doctrine.event_listener:
services:
AppEventListenerLoadClassMetadataListener:
tags:
- { name: doctrine.event_listener, event: loadClassMetadata }
Пример
Давайте изменим настройки существующего поля
text у сущности Article, сделав его
необязательным:
<?php
namespace AppEventListener;
use AppEntityArticle;
use DoctrineORMEventLoadClassMetadataEventArgs;
class LoadClassMetadataListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $args): void
{
$metadata = $args->getClassMetadata();
if ($metadata->getName() !== Article::class) {
return;
}
if ($metadata->hasField('text')) {
$metadata->fieldMappings['text']['nullable'] = true;
}
}
}
?>
Пример
Давайте добавим индекс по полю string через
событие LoadClassMetadata:
<?php
namespace AppEventListener;
use AppEntityArticle;
use DoctrineORMEventLoadClassMetadataEventArgs;
class LoadClassMetadataListener
{
public function loadClassMetadata(LoadClassMetadataEventArgs $args): void
{
$metadata = $args->getClassMetadata();
if ($metadata->getName() !== Article::class) {
return;
}
$metadata->addIndex(['string'], 'idx_article_string');
}
}
?>
После этого можно обновить схему базы данных:
php bin/console doctrine:schema:update --force