From 3eda25c9cc9087437d409e6af1e9fd562e2ad695 Mon Sep 17 00:00:00 2001 From: Michael Babker Date: Sat, 10 May 2025 18:35:36 -0400 Subject: [PATCH] Fix compat with doctrine/mongodb-odm 2.11 --- src/Mapping/Event/Adapter/ODM.php | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Mapping/Event/Adapter/ODM.php b/src/Mapping/Event/Adapter/ODM.php index d86fdb1c0..e434bfc61 100644 --- a/src/Mapping/Event/Adapter/ODM.php +++ b/src/Mapping/Event/Adapter/ODM.php @@ -14,6 +14,7 @@ use Doctrine\ODM\MongoDB\DocumentManager; use Doctrine\ODM\MongoDB\Event\LifecycleEventArgs; use Doctrine\ODM\MongoDB\Mapping\ClassMetadata; +use Doctrine\ODM\MongoDB\UnitOfWork; use Gedmo\Exception\RuntimeException; use Gedmo\Mapping\Event\AdapterInterface; @@ -29,6 +30,8 @@ class ODM implements AdapterInterface private ?DocumentManager $dm = null; + private static ?bool $useIntId = null; + public function __call($method, $args) { Deprecation::trigger( @@ -150,12 +153,12 @@ public function getScheduledObjectDeletions($uow) public function setOriginalObjectProperty($uow, $object, $property, $value) { - $uow->setOriginalDocumentProperty(spl_object_hash($object), $property, $value); + $uow->setOriginalDocumentProperty($this->getOid($uow, $object), $property, $value); } public function clearObjectChangeSet($uow, $object) { - $uow->clearDocumentChangeSet(spl_object_hash($object)); + $uow->clearDocumentChangeSet($this->getOid($uow, $object)); } /** @@ -179,4 +182,21 @@ public function createLifecycleEventArgsInstance($document, $documentManager) return new LifecycleEventArgs($document, $documentManager); } + + /** + * @return int|string dependent on the version of `doctrine/mongodb-odm` installed + */ + private function getOid(UnitOfWork $uow, object $object) + { + if (null === self::$useIntId) { + $refl = new \ReflectionClass($uow); + $method = $refl->getMethod('setOriginalDocumentProperty'); + $oidArg = $method->getParameters()[0]; + + /** @phpstan-ignore-next-line method.NotFound All supported versions of `doctrine/mongodb-odm` have the first param typehinted */ + self::$useIntId = 'int' === $oidArg->getType()->getName(); + } + + return true === self::$useIntId ? spl_object_id($object) : spl_object_hash($object); + } }