diff --git a/src/Doctrine/TablePrefix.php b/src/Doctrine/TablePrefix.php index 41b56c603..c3cf28b47 100644 --- a/src/Doctrine/TablePrefix.php +++ b/src/Doctrine/TablePrefix.php @@ -19,7 +19,7 @@ public function __construct($tablePrefix, ManagerRegistry $managerRegistry) public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void { - if ($tablePrefix = $this->getTablePrefix()) { + if ($tablePrefix = $this->getTablePrefix($eventArgs->getEntityManager())) { $classMetadata = $eventArgs->getClassMetadata(); if (! $classMetadata->isInheritanceTypeSingleTable() diff --git a/src/Doctrine/TablePrefixTrait.php b/src/Doctrine/TablePrefixTrait.php index d4966a75a..66d618a51 100644 --- a/src/Doctrine/TablePrefixTrait.php +++ b/src/Doctrine/TablePrefixTrait.php @@ -23,6 +23,10 @@ trait TablePrefixTrait protected function setTablePrefix(ObjectManager $manager, string $prefix) { + // Force initializing the ObjectManager by calling a method in case it is a proxy for + // a lazily initialized service using symfony/proxy-manager-bridge. + // Doing this before calling spl_object_hash() makes sure we are getting the 'correct' hash + $manager->getMetadataFactory(); $key = spl_object_hash($manager); $this->tablePrefixes[$key] = Str::ensureEndsWith($prefix, '_'); @@ -46,14 +50,14 @@ protected function setTablePrefixes($tablePrefixes, ManagerRegistry $managerRegi return $this; } - /** - * Since we introduced `symfony/proxy-manager-bridge`, the keys in the tableprefix - * no longer match what the manager tells us it should be. For example, the - * given key was `0000000005ee10ad0000000043b453e3`, but in our reference - * table we had `0000000005ee10e90000000043b453e3`. We just return the first one, now - */ - protected function getTablePrefix(): string + protected function getTablePrefix(ObjectManager $manager) { - return current($this->tablePrefixes) ?? ''; + // Force initializing the ObjectManager by calling a method in case it is a proxy for + // a lazily initialized service using symfony/proxy-manager-bridge. + // Doing this before calling spl_object_hash() makes sure we are getting the 'correct' hash + $manager->getMetadataFactory(); + $key = spl_object_hash($manager); + + return $this->tablePrefixes[$key] ?? ''; } }