SlideShare ist ein Scribd-Unternehmen logo
1 von 18
Downloaden Sie, um offline zu lesen
Presentation title here
Событийная система в
Doctrine2
Сергей Журавель
szhuravel@magecore.com
https://github.com/sergeyz
Presentation title here
Doctrine предоставляет возможность расширять свою логику с помощью
событийной системы
DoctrineORMEvents
Presentation title here
DoctrineORMEvents::prePersist
● $entityManager->persist($entity)
● Для связей c cascade={"persist"}
● $entityManager->flush() для новых сущностей в связях при cascade=
{"persist"}
● $entityManager->merge($entity)
● $unitOfWork->computeChangeSet($classMetadata, $entity) для новых
сущностей в связях при cascade={"persist"}
● На этом этапе в сущностях нету
идентификатора
● Изменения связей в подписчике не учитываются
Presentation title here
DoctrineORMEvents::preRemove
● $entityManager->remove($entity)
● Для связей с cascade={"remove"}
● Изменения полей в подписчике не
учитываются
● Изменения связей в подписчике не
учитываются
Presentation title here
DoctrineORMEvents::preFlush
● $entityManager->flush()
● $unitOfWork->computeChangeSet($classMetadata, $entity)
● На этом событии можно
вызывать $entityManager-
>flush() без ограничений
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) {}
Presentation title here
DoctrineORMEvents::onFlush
● Создавать сущности можно только пересчитав их changeSet
$unitOfWork->computeChangeSet($classMetadata, $entity)
● Изменения в связанных сущностях нужно пересчитывать
$unitOfWork->recomputeSingleEntityChangeSet($classMetadata, $entity)
● Если changeSets пустые будет вызван даже с пустым changeSet
Presentation title here
DoctrineORMEvents::postFlush
● Перед завершением $entityManager->flush()
● Если changeSets пустые будет вызван даже с пустым changeSet
● Вызывать $entityManager->flush() в
подписчике на этом событии не
рекомендовано
Presentation title here
DoctrineORMEvents::preUpdate
● Перед обновлением сущности в $entityManager->flush()
● Пересчитывать chageSet не нужно
● Не вызывается если changeSet пустой
Presentation title here
DoctrineORMEvents::preUpdate
● Не разрешается менять скаляры напрямую, только с помощью
DoctrineORMEventPreUpdateEventArgs $args->setNewValue('field',
'value')
● $entityManager->persist($entity) или $entityManager->remove($entity)
даже с использованием $unitOfWork могут привести к unexpected
behavior
● Не разрешается менять сущности в связях
Presentation title here
DoctrineORMEvents::postUpdate
DoctrineORMEvents::postRemove
DoctrineORMEvents::postPersist
● После соответствующих действий
● Изменения в сущностях не
учитываются
Presentation title here
DoctrineORMEvents::postLoad
● При создании новой сущности
после гидрации
● При очистке гидратора
DoctrineORMEvents::onClear
● При очистке $entityManager-
>clear() после $entityManager-
>flush()
Presentation title here
Подписки
Event Listener Event Subscriber
Entity Listener
Presentation title here
ClassMetadata события
● DoctrineORMEvents::DoctrineORMEvents::loadClassMetadata
○ После чтения маппингов и создании
DoctrineORMMappingClassMetadataInfo на их основании
● DoctrineORMEvents::DoctrineORMEvents::
onClassMetadataNotFound
○ Если данные для сущности не найдены, можно добавить fallback
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()
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)
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
Presentation title here
KEEP CALM
AND
ASK QUESTIONS

Weitere ähnliche Inhalte

Was ist angesagt?

YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
Alexander Makarov
 
Yii development
Yii developmentYii development
Yii development
MageCloud
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
ITmozg
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
Magecom Ukraine
 
Entity framework
Entity frameworkEntity framework
Entity framework
Scaiper
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
Magecom Ukraine
 

Was ist angesagt? (18)

Swift School #4
Swift School #4Swift School #4
Swift School #4
 
YiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что новогоYiiConf 2012 - Alexander Makarov - Yii2, что нового
YiiConf 2012 - Alexander Makarov - Yii2, что нового
 
PVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибокPVS-Studio в 2021 - Примеры ошибок
PVS-Studio в 2021 - Примеры ошибок
 
Vuejs composition API
Vuejs composition APIVuejs composition API
Vuejs composition API
 
Григорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптерГригорий Демченко, Универсальный адаптер
Григорий Демченко, Универсальный адаптер
 
Yii development
Yii developmentYii development
Yii development
 
I tmozg js_school_jquery
I tmozg js_school_jqueryI tmozg js_school_jquery
I tmozg js_school_jquery
 
XPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriverXPath локаторы в Selenium WebDriver
XPath локаторы в Selenium WebDriver
 
Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1Подробная презентация JavaScript 6 в 1
Подробная презентация JavaScript 6 в 1
 
Алексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать LaravelАлексей Плеханов: 25 причин попробовать Laravel
Алексей Плеханов: 25 причин попробовать Laravel
 
Angular 2: Всех переиграл
Angular 2: Всех переигралAngular 2: Всех переиграл
Angular 2: Всех переиграл
 
Реализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в MagentoРеализация шаблонов корпоративных приложений в Magento
Реализация шаблонов корпоративных приложений в Magento
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
 
Entity framework
Entity frameworkEntity framework
Entity framework
 
функции в Java script
функции в Java scriptфункции в Java script
функции в Java script
 
Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2Примеры решения типичных задач за рамками ядра Yii2
Примеры решения типичных задач за рамками ядра Yii2
 
Индексирование в Magento
Индексирование в MagentoИндексирование в Magento
Индексирование в Magento
 
Веселая ферма. Соседи.
Веселая ферма. Соседи.Веселая ферма. Соседи.
Веселая ферма. Соседи.
 

Andere mochten auch

Symfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 IntegrationSymfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 Integration
Jonathan Wage
 
Doctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 ParisDoctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 Paris
Jonathan Wage
 

Andere mochten auch (14)

Doctrine Internals. UnitOfWork
Doctrine Internals. UnitOfWorkDoctrine Internals. UnitOfWork
Doctrine Internals. UnitOfWork
 
Scalability
ScalabilityScalability
Scalability
 
Effective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 DevelopersEffective Doctrine2: Performance Tips for Symfony2 Developers
Effective Doctrine2: Performance Tips for Symfony2 Developers
 
Data cache management in php
Data cache management in phpData cache management in php
Data cache management in php
 
Using Oro layouts
Using Oro layoutsUsing Oro layouts
Using Oro layouts
 
Understanding Doctrine at True North PHP 2013
Understanding Doctrine at True North PHP 2013Understanding Doctrine at True North PHP 2013
Understanding Doctrine at True North PHP 2013
 
Symfony2. Database and Doctrine
Symfony2. Database and DoctrineSymfony2. Database and Doctrine
Symfony2. Database and Doctrine
 
Symfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 IntegrationSymfony2 and Doctrine2 Integration
Symfony2 and Doctrine2 Integration
 
ORM dont kill your DB, developers do
ORM dont kill your DB, developers doORM dont kill your DB, developers do
ORM dont kill your DB, developers do
 
Magento 2.1 ee content staging
Magento 2.1 ee content stagingMagento 2.1 ee content staging
Magento 2.1 ee content staging
 
Caching basics in PHP
Caching basics in PHPCaching basics in PHP
Caching basics in PHP
 
Doctrine ORM & model
Doctrine ORM & modelDoctrine ORM & model
Doctrine ORM & model
 
Doctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 ParisDoctrine In The Real World sflive2011 Paris
Doctrine In The Real World sflive2011 Paris
 
Doctrine 2 - Not The Same Old Php Orm
Doctrine 2 - Not The Same Old Php OrmDoctrine 2 - Not The Same Old Php Orm
Doctrine 2 - Not The Same Old Php Orm
 

Ähnlich wie ORO Meetups - Doctrine Events

ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf Conference
 
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
victor-yastrebov
 
10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell
Andrey Markin
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Ontico
 

Ähnlich wie ORO Meetups - Doctrine Events (14)

ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
ZFConf 2010: Zend Framework & MVC, Model Implementation (Part 1)
 
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
ПВТ - осень 2014 - Лекция 6 - Атомарные операции. Внеочередное выполнение инс...
 
PostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of HellPostgreSQL Vacuum: Nine Circles of Hell
PostgreSQL Vacuum: Nine Circles of Hell
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
Batch processing in rails
Batch processing in railsBatch processing in rails
Batch processing in rails
 
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
SECON'2017, Лесовский Алексей, Потоковая репликация в PostgreSQL.
 
PostgreSQL Streaming Replication
PostgreSQL Streaming ReplicationPostgreSQL Streaming Replication
PostgreSQL Streaming Replication
 
Magento - Антон Капля
Magento - Антон КапляMagento - Антон Капля
Magento - Антон Капля
 
Triggers для Mysql
Triggers для MysqlTriggers для Mysql
Triggers для Mysql
 
Использование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработкиИспользование юнит-тестов для повышения качества разработки
Использование юнит-тестов для повышения качества разработки
 
Dependency injection, phemto
Dependency injection, phemtoDependency injection, phemto
Dependency injection, phemto
 
10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell10 задач администрирования Active directory, решаемых с помощью power shell
10 задач администрирования Active directory, решаемых с помощью power shell
 
Everything You Need to Know About WP_Query, WordCamp Russia 2014
Everything You Need to Know About WP_Query, WordCamp Russia 2014Everything You Need to Know About WP_Query, WordCamp Russia 2014
Everything You Need to Know About WP_Query, WordCamp Russia 2014
 
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
Девять кругов ада или PostgreSQL Vacuum / Алексей Лесовский (PostgreSQL-Consu...
 

ORO Meetups - Doctrine Events

  • 1. Presentation title here Событийная система в Doctrine2 Сергей Журавель szhuravel@magecore.com https://github.com/sergeyz
  • 2. Presentation title here Doctrine предоставляет возможность расширять свою логику с помощью событийной системы DoctrineORMEvents
  • 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"} ● На этом этапе в сущностях нету идентификатора ● Изменения связей в подписчике не учитываются
  • 4. Presentation title here DoctrineORMEvents::preRemove ● $entityManager->remove($entity) ● Для связей с cascade={"remove"} ● Изменения полей в подписчике не учитываются ● Изменения связей в подписчике не учитываются
  • 5. Presentation title here DoctrineORMEvents::preFlush ● $entityManager->flush() ● $unitOfWork->computeChangeSet($classMetadata, $entity) ● На этом событии можно вызывать $entityManager- >flush() без ограничений
  • 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() в подписчике на этом событии не рекомендовано
  • 9. Presentation title here DoctrineORMEvents::preUpdate ● Перед обновлением сущности в $entityManager->flush() ● Пересчитывать chageSet не нужно ● Не вызывается если changeSet пустой
  • 10. Presentation title here DoctrineORMEvents::preUpdate ● Не разрешается менять скаляры напрямую, только с помощью DoctrineORMEventPreUpdateEventArgs $args->setNewValue('field', 'value') ● $entityManager->persist($entity) или $entityManager->remove($entity) даже с использованием $unitOfWork могут привести к unexpected behavior ● Не разрешается менять сущности в связях
  • 11. Presentation title here DoctrineORMEvents::postUpdate DoctrineORMEvents::postRemove DoctrineORMEvents::postPersist ● После соответствующих действий ● Изменения в сущностях не учитываются
  • 12. Presentation title here DoctrineORMEvents::postLoad ● При создании новой сущности после гидрации ● При очистке гидратора DoctrineORMEvents::onClear ● При очистке $entityManager- >clear() после $entityManager- >flush()
  • 13. Presentation title here Подписки Event Listener Event Subscriber Entity Listener
  • 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
  • 18. Presentation title here KEEP CALM AND ASK QUESTIONS