Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ORO Meetups - Doctrine Events

ORO Meetups - Doctrine Events

Sergey Zhuravel

September 10, 2015
Tweet

More Decks by Sergey Zhuravel

Other Decks in Programming

Transcript

  1. 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"} • На этом этапе в сущностях нету идентификатора • Изменения связей в подписчике не учитываются
  2. Presentation title here Doctrine\ORM\Events::preRemove • $entityManager->remove($entity) • Для связей с

    cascade={"remove"} • Изменения полей в подписчике не учитываются • Изменения связей в подписчике не учитываются
  3. Presentation title here Doctrine\ORM\Events::preFlush • $entityManager->flush() • $unitOfWork->computeChangeSet($classMetadata, $entity) •

    На этом событии можно вызывать $entityManager- >flush() без ограничений
  4. 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) {}
  5. Presentation title here Doctrine\ORM\Events::onFlush • Создавать сущности можно только пересчитав

    их changeSet $unitOfWork->computeChangeSet($classMetadata, $entity) • Изменения в связанных сущностях нужно пересчитывать $unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity) • Если changeSets пустые будет вызван даже с пустым changeSet
  6. Presentation title here Doctrine\ORM\Events::postFlush • Перед завершением $entityManager->flush() • Если

    changeSets пустые будет вызван даже с пустым changeSet • Вызывать $entityManager->flush() в подписчике на этом событии не рекомендовано
  7. Presentation title here Doctrine\ORM\Events::preUpdate • Перед обновлением сущности в $entityManager->flush()

    • Пересчитывать chageSet не нужно • Не вызывается если changeSet пустой
  8. Presentation title here Doctrine\ORM\Events::preUpdate • Не разрешается менять скаляры напрямую,

    только с помощью Doctrine\ORM\Event\PreUpdateEventArgs $args->setNewValue('field', 'value') • $entityManager->persist($entity) или $entityManager->remove($entity) даже с использованием $unitOfWork могут привести к unexpected behavior • Не разрешается менять сущности в связях
  9. Presentation title here Doctrine\ORM\Events::postLoad • При создании новой сущности после

    гидрации • При очистке гидратора Doctrine\ORM\Events::onClear • При очистке $entityManager- >clear() после $entityManager- >flush()
  10. Presentation title here ClassMetadata события • Doctrine\ORM\Events::Doctrine\ORM\Events::loadClassMetadata ◦ После чтения

    маппингов и создании Doctrine\ORM\Mapping\ClassMetadataInfo на их основании • Doctrine\ORM\Events::Doctrine\ORM\Events:: onClassMetadataNotFound ◦ Если данные для сущности не найдены, можно добавить fallback
  11. 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()
  12. 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)