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

Событие 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

Смотрите также

  • атрибут Entity,
    который помечает класс как сущность Doctrine
  • атрибут Table,
    который задаёт имя таблицы для сущности
  • атрибут Index,
    который создаёт индекс по полям сущности
  • событие PostLoad,
    которое вызывается после загрузки сущности
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить