3. Presentation title here
DoctrineORMEvents::prePersist
● $entityManager->persist($entity)
● Для связей c cascade={"persist"}
● $entityManager->flush() для новых сущностей в связях при cascade=
{"persist"}
● $entityManager->merge($entity)
● $unitOfWork->computeChangeSet($classMetadata, $entity) для новых
сущностей в связях при cascade={"persist"}
● На этом этапе в сущностях нету
идентификатора
● Изменения связей в подписчике не учитываются
6. Presentation title here
DoctrineORMEvents::onFlush
● $entityManager->flush() после вычислений changeSet
● Имеет доступ ко всем изменениям
foreach ($uow->getScheduledEntityInsertions() as $entity) {}
foreach ($uow->getScheduledEntityUpdates() as $entity) {}
foreach ($uow->getScheduledEntityDeletions() as $entity) {}
foreach ($uow->getScheduledCollectionDeletions() as $collection) {}
foreach ($uow->getScheduledCollectionUpdates() as $collection) {}
7. Presentation title here
DoctrineORMEvents::onFlush
● Создавать сущности можно только пересчитав их changeSet
$unitOfWork->computeChangeSet($classMetadata, $entity)
● Изменения в связанных сущностях нужно пересчитывать
$unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity)
● Если changeSets пустые будет вызван даже с пустым changeSet
8. Presentation title here
DoctrineORMEvents::postFlush
● Перед завершением $entityManager->flush()
● Если changeSets пустые будет вызван даже с пустым changeSet
● Вызывать $entityManager->flush() в
подписчике на этом событии не
рекомендовано
10. Presentation title here
DoctrineORMEvents::preUpdate
● Не разрешается менять скаляры напрямую, только с помощью
DoctrineORMEventPreUpdateEventArgs $args->setNewValue('field',
'value')
● $entityManager->persist($entity) или $entityManager->remove($entity)
даже с использованием $unitOfWork могут привести к unexpected
behavior
● Не разрешается менять сущности в связях
12. Presentation title here
DoctrineORMEvents::postLoad
● При создании новой сущности
после гидрации
● При очистке гидратора
DoctrineORMEvents::onClear
● При очистке $entityManager-
>clear() после $entityManager-
>flush()
14. Presentation title here
ClassMetadata события
● DoctrineORMEvents::DoctrineORMEvents::loadClassMetadata
○ После чтения маппингов и создании
DoctrineORMMappingClassMetadataInfo на их основании
● DoctrineORMEvents::DoctrineORMEvents::
onClassMetadataNotFound
○ Если данные для сущности не найдены, можно добавить fallback
15. Presentation title here
Аргументы
● DoctrineORMEventLifecycleEventArgs (OnFlushEventArgs,
PostFlushEventArgs, PreFlushEventArgs)
○ public function getEntity()
○ public function getEntityManager()
○ public function getObject()
○ public function getObjectManager()
● DoctrineORMEventOnClassMetadataNotFoundEventArgs
○ public function setFoundMetadata(ClassMetadata $classMetadata =
null)
○ public function getFoundMetadata()
○ public function getClassName()
16. Presentation title here
Аргументы
● DoctrineORMEventLoadClassMetadataEventArgs
○ public function getClassMetadata()
● DoctrineORMEventOnClearEventArgs
○ public function getEntityClass()
○ public function clearsAllEntities()
● DoctrineORMEventPreUpdateEventArgs
○ public function getEntityChangeSet()
○ public function hasChangedField($field)
○ public function getOldValue($field)
○ public function getNewValue($field)
○ public function setNewValue($field, $value)
17. Presentation title here
Read more...
● http://doctrine-orm.readthedocs.org/en/latest/reference/events.html
● http://odiszapc.ru/doctrine/events/
● http://symfony.
com/doc/current/cookbook/doctrine/event_listeners_subscribers.html