From 83284b39bd1aecee4071920cd26d2312ff61064c Mon Sep 17 00:00:00 2001 From: "a.dmitryuk" Date: Sun, 4 Dec 2022 17:15:27 +0700 Subject: [PATCH 1/5] Cache DH Annotations --- src/Provider/Doctrine/DoctrineProvider.php | 33 +++++++++++++--------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/Provider/Doctrine/DoctrineProvider.php b/src/Provider/Doctrine/DoctrineProvider.php index 07d9ef4a..9fdd9bb5 100644 --- a/src/Provider/Doctrine/DoctrineProvider.php +++ b/src/Provider/Doctrine/DoctrineProvider.php @@ -168,24 +168,21 @@ public function isAudited($entity): bool $configuration = $this->configuration; $class = DoctrineHelper::getRealClassName($entity); + $entities = $configuration->getEntities(); // is $entity part of audited entities? - if (!\array_key_exists($class, $configuration->getEntities())) { + if (!\array_key_exists($class, $entities)) { // no => $entity is not audited return false; } - $entityOptions = $configuration->getEntities()[$class]; + $entityOptions = $entities[$class]; if (null === $entityOptions) { // no option defined => $entity is audited return true; } - if (isset($entityOptions['enabled'])) { - return (bool) $entityOptions['enabled']; - } - - return true; + return $entityOptions['enabled'] ?? true; } /** @@ -238,14 +235,24 @@ public function setStorageMapper(callable $storageMapper): void $this->configuration->setStorageMapper($storageMapper); } - public function loadAnnotations(EntityManagerInterface $entityManager, ?array $entities = null): self + public function loadAnnotations(EntityManagerInterface $entityManager, array $entities): self { \assert($this->configuration instanceof Configuration); // helps PHPStan - $annotationLoader = new AnnotationLoader($entityManager); - $this->configuration->setEntities(array_merge( - $entities ?? $this->configuration->getEntities(), - $annotationLoader->load() - )); + $ormConfiguration = $entityManager->getConfiguration(); + $metadataCache = $ormConfiguration->getMetadataCache(); + + if (null !== $metadataCache) { + // $proxyDir is used to hash entityManager + $item = $metadataCache->getItem('__DH_ANNOTATIONS__'); + if (!$item->isHit() || !\is_array($value = $item->get())) { + $annotationLoader = new AnnotationLoader($entityManager); + $value = $annotationLoader->load(); + $item->set($value); + $metadataCache->save($item); + } + $entities = [...$entities, ...$value]; + } + $this->configuration->setEntities($entities); return $this; } From 8cc89a5dbb87bed7ad356f59f9e0b0b2750479ac Mon Sep 17 00:00:00 2001 From: "a.dmitryuk" Date: Sun, 4 Dec 2022 17:16:38 +0700 Subject: [PATCH 2/5] Cache DH Annotations --- src/Provider/Doctrine/DoctrineProvider.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Provider/Doctrine/DoctrineProvider.php b/src/Provider/Doctrine/DoctrineProvider.php index 9fdd9bb5..7a812282 100644 --- a/src/Provider/Doctrine/DoctrineProvider.php +++ b/src/Provider/Doctrine/DoctrineProvider.php @@ -182,7 +182,11 @@ public function isAudited($entity): bool return true; } - return $entityOptions['enabled'] ?? true; + if (isset($entityOptions['enabled'])) { + return (bool) $entityOptions['enabled']; + } + + return true; } /** From eee4be7182ae8e96dcca8bcacd223386fe9ef441 Mon Sep 17 00:00:00 2001 From: "a.dmitryuk" Date: Sun, 4 Dec 2022 18:17:00 +0700 Subject: [PATCH 3/5] speed --- src/Provider/Doctrine/DoctrineProvider.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Provider/Doctrine/DoctrineProvider.php b/src/Provider/Doctrine/DoctrineProvider.php index 7a812282..00620591 100644 --- a/src/Provider/Doctrine/DoctrineProvider.php +++ b/src/Provider/Doctrine/DoctrineProvider.php @@ -254,7 +254,7 @@ public function loadAnnotations(EntityManagerInterface $entityManager, array $en $item->set($value); $metadataCache->save($item); } - $entities = [...$entities, ...$value]; + $entities = array_merge($entities, $value); } $this->configuration->setEntities($entities); From 17313c97834c71434aa8e5573c42922a57ad8d78 Mon Sep 17 00:00:00 2001 From: "a.dmitryuk" Date: Sun, 4 Dec 2022 18:34:33 +0700 Subject: [PATCH 4/5] remove getOwner call --- .../Doctrine/Auditing/Transaction/TransactionHydrator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Provider/Doctrine/Auditing/Transaction/TransactionHydrator.php b/src/Provider/Doctrine/Auditing/Transaction/TransactionHydrator.php index 2304e63d..fa09fd66 100644 --- a/src/Provider/Doctrine/Auditing/Transaction/TransactionHydrator.php +++ b/src/Provider/Doctrine/Auditing/Transaction/TransactionHydrator.php @@ -103,7 +103,7 @@ private function hydrateWithScheduledCollectionUpdates(Transaction $transaction, /** @var object $entity */ foreach ($collection->getDeleteDiff() as $entity) { - if ($this->provider->isAudited($entity) && $collection->getOwner()) { + if ($this->provider->isAudited($entity)) { $transaction->dissociate( $owner, $entity, From d2da374264974827240869bd970c41182f28b400 Mon Sep 17 00:00:00 2001 From: "a.dmitryuk" Date: Sun, 4 Dec 2022 19:04:17 +0700 Subject: [PATCH 5/5] else --- src/Provider/Doctrine/DoctrineProvider.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Provider/Doctrine/DoctrineProvider.php b/src/Provider/Doctrine/DoctrineProvider.php index 00620591..0e2349f3 100644 --- a/src/Provider/Doctrine/DoctrineProvider.php +++ b/src/Provider/Doctrine/DoctrineProvider.php @@ -245,18 +245,19 @@ public function loadAnnotations(EntityManagerInterface $entityManager, array $en $ormConfiguration = $entityManager->getConfiguration(); $metadataCache = $ormConfiguration->getMetadataCache(); + $annotationLoader = new AnnotationLoader($entityManager); + if (null !== $metadataCache) { - // $proxyDir is used to hash entityManager $item = $metadataCache->getItem('__DH_ANNOTATIONS__'); - if (!$item->isHit() || !\is_array($value = $item->get())) { - $annotationLoader = new AnnotationLoader($entityManager); - $value = $annotationLoader->load(); - $item->set($value); + if (!$item->isHit() || !\is_array($annotationEntities = $item->get())) { + $annotationEntities = $annotationLoader->load(); + $item->set($annotationEntities); $metadataCache->save($item); } - $entities = array_merge($entities, $value); + } else { + $annotationEntities = $annotationLoader->load(); } - $this->configuration->setEntities($entities); + $this->configuration->setEntities(array_merge($entities, $annotationEntities)); return $this; }