oro meetups - doctrine events
TRANSCRIPT
Presentation title here
Событийная система в Doctrine2
Сергей Журавель[email protected]://github.com/sergeyz
Presentation title here
Doctrine предоставляет возможность расширять свою логику с помощью событийной системы
Doctrine\ORM\Events
Presentation title here
Doctrine\ORM\Events::prePersist
● $entityManager->persist($entity)
● Для связей c cascade={"persist"}
● $entityManager->flush() для новых сущностей в связях при cascade=
{"persist"}
● $entityManager->merge($entity)
● $unitOfWork->computeChangeSet($classMetadata, $entity) для новых
сущностей в связях при cascade={"persist"}
● На этом этапе в сущностях нету
идентификатора
● Изменения связей в подписчике не учитываются
Presentation title here
Doctrine\ORM\Events::preRemove
● $entityManager->remove($entity)
● Для связей с cascade={"remove"}
● Изменения полей в подписчике не
учитываются
● Изменения связей в подписчике не
учитываются
Presentation title here
Doctrine\ORM\Events::preFlush
● $entityManager->flush()
● $unitOfWork->computeChangeSet($classMetadata, $entity)
● На этом событии можно
вызывать $entityManager-
>flush() без ограничений
Presentation title here
Doctrine\ORM\Events::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) {}
Presentation title here
Doctrine\ORM\Events::onFlush
● Создавать сущности можно только пересчитав их changeSet
$unitOfWork->computeChangeSet($classMetadata, $entity)
● Изменения в связанных сущностях нужно пересчитывать
$unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity)
● Если changeSets пустые будет вызван даже с пустым changeSet
Presentation title here
Doctrine\ORM\Events::postFlush
● Перед завершением $entityManager->flush()
● Если changeSets пустые будет вызван даже с пустым changeSet
● Вызывать $entityManager->flush() в
подписчике на этом событии не
рекомендовано
Presentation title here
Doctrine\ORM\Events::preUpdate
● Перед обновлением сущности в $entityManager->flush()
● Пересчитывать chageSet не нужно
● Не вызывается если changeSet пустой
Presentation title here
Doctrine\ORM\Events::preUpdate● Не разрешается менять скаляры напрямую, только с помощью
Doctrine\ORM\Event\PreUpdateEventArgs $args->setNewValue('field', 'value')
● $entityManager->persist($entity) или $entityManager->remove($entity) даже с использованием $unitOfWork могут привести к unexpected behavior
● Не разрешается менять сущности в связях
Presentation title here
Doctrine\ORM\Events::postUpdate
Doctrine\ORM\Events::postRemove
Doctrine\ORM\Events::postPersist
● После соответствующих действий
● Изменения в сущностях не
учитываются
Presentation title here
Doctrine\ORM\Events::postLoad
● При создании новой сущности
после гидрации
● При очистке гидратора
Doctrine\ORM\Events::onClear
● При очистке $entityManager-
>clear() после $entityManager-
>flush()
Presentation title here
ClassMetadata события
● Doctrine\ORM\Events::Doctrine\ORM\Events::loadClassMetadata○ После чтения маппингов и создании
Doctrine\ORM\Mapping\ClassMetadataInfo на их основании
● Doctrine\ORM\Events::Doctrine\ORM\Events::onClassMetadataNotFound○ Если данные для сущности не найдены, можно добавить fallback
Presentation title here
Аргументы
● Doctrine\ORM\Event\LifecycleEventArgs (OnFlushEventArgs,
PostFlushEventArgs, PreFlushEventArgs)
○ public function getEntity()
○ public function getEntityManager()
○ public function getObject()
○ public function getObjectManager()
● Doctrine\ORM\Event\OnClassMetadataNotFoundEventArgs
○ public function setFoundMetadata(ClassMetadata $classMetadata =
null)
○ public function getFoundMetadata()
○ public function getClassName()
Presentation title here
Аргументы
● Doctrine\ORM\Event\LoadClassMetadataEventArgs
○ public function getClassMetadata()
● Doctrine\ORM\Event\OnClearEventArgs
○ public function getEntityClass()
○ public function clearsAllEntities()
● Doctrine\ORM\Event\PreUpdateEventArgs
○ public function getEntityChangeSet()
○ public function hasChangedField($field)
○ public function getOldValue($field)
○ public function getNewValue($field)
○ public function setNewValue($field, $value)
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