oro meetups - doctrine events

18
Presentation title here Событийная система в Doctrine2 Сергей Журавель [email protected] https://github.com/sergeyz

Upload: sergeyz

Post on 16-Apr-2017

455 views

Category:

Technology


0 download

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

Подписки

Event Listener Event Subscriber

Entity Listener

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

KEEP CALM AND

ASK QUESTIONS