Skip to content

Commit 85f9fb0

Browse files
committed
Added the "forceUseAttributeReader" option, which allows you to use AttributeReader auto
1 parent 910c4ba commit 85f9fb0

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ a release.
1818
---
1919

2020
## [Unreleased]
21+
### Fixed
22+
- Mapping Driver: Added option `forceUseAttributeReader`, force the use of AttributeReader for Gedmo attributes ( ignore default XML driver for all namespaces) (#2613)
2123

2224
## [3.18.0] - 2025-02-01
2325
### Added
@@ -93,7 +95,7 @@ a release.
9395
- Dropped support for doctrine/dbal < 3.2
9496

9597
### Deprecated
96-
- Calling `Gedmo\Mapping\Event\Adapter\ORM::getObjectManager()` and `getObject()` on EventArgs that do not implement `getObjectManager()` and `getObject()` (such as old EventArgs implementing `getEntityManager()` and `getEntity()`)
98+
- Calling `Gedmo\Mapping\Event\Adapter\ORM::getObjectManager()` and `getObject()` on EventArgs that do not implement `getObjectManager()` and `getObject()` (such as old EventArgs implementing `getEntityManager()` and `getEntity()`)
9799
- Calling `Gedmo\Uploadable\Event\UploadableBaseEventArgs::getEntityManager()` and `getEntity()`. Call `getObjectManager()` and `getObject()` instead.
98100

99101
## [3.13.0] - 2023-09-06

src/Mapping/ExtensionMetadataFactory.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Doctrine\ODM\MongoDB\Mapping\ClassMetadata as DocumentClassMetadata;
1616
use Doctrine\ORM\Mapping\ClassMetadata as EntityClassMetadata;
1717
use Doctrine\ORM\Mapping\ClassMetadataInfo as LegacyEntityClassMetadata;
18+
use Doctrine\ORM\Mapping\Driver\AttributeDriver;
1819
use Doctrine\Persistence\Mapping\ClassMetadata;
1920
use Doctrine\Persistence\Mapping\Driver\DefaultFileLocator;
2021
use Doctrine\Persistence\Mapping\Driver\MappingDriver;
@@ -70,12 +71,18 @@ class ExtensionMetadataFactory
7071

7172
private ?CacheItemPoolInterface $cacheItemPool = null;
7273

74+
/**
75+
* Ignore doctrine driver class and force use attribute reader for gedmo properties
76+
* @var bool
77+
*/
78+
private $forceUseAttributeReader;
79+
7380
/**
7481
* @param Reader|AttributeReader|object|null $annotationReader
7582
*
7683
* @note Providing any object as the third argument is deprecated, as of 4.0 an {@see AttributeReader} will be required
7784
*/
78-
public function __construct(ObjectManager $objectManager, string $extensionNamespace, ?object $annotationReader = null, ?CacheItemPoolInterface $cacheItemPool = null)
85+
public function __construct(ObjectManager $objectManager, string $extensionNamespace, ?object $annotationReader = null, ?CacheItemPoolInterface $cacheItemPool = null, bool $forceUseAttributeReader = false)
7986
{
8087
if (null !== $annotationReader) {
8188
if ($annotationReader instanceof Reader) {
@@ -101,6 +108,7 @@ public function __construct(ObjectManager $objectManager, string $extensionNames
101108
$this->objectManager = $objectManager;
102109
$this->annotationReader = $annotationReader;
103110
$this->extensionNamespace = $extensionNamespace;
111+
$this->forceUseAttributeReader = $forceUseAttributeReader;
104112
$omDriver = $objectManager->getConfiguration()->getMetadataDriverImpl();
105113
$this->driver = $this->getDriver($omDriver);
106114
$this->cacheItemPool = $cacheItemPool;
@@ -205,11 +213,19 @@ protected function getDriver($omDriver)
205213
$driverName = substr($className, strrpos($className, '\\') + 1);
206214
if ($omDriver instanceof MappingDriverChain || 'DriverChain' === $driverName) {
207215
$driver = new Chain();
216+
$attributeDriver = $this->forceUseAttributeReader ? new AttributeDriver([], true) : null;
208217
foreach ($omDriver->getDrivers() as $namespace => $nestedOmDriver) {
218+
if (!$nestedOmDriver instanceof AttributeDriver && $attributeDriver) {
219+
$nestedOmDriver = $attributeDriver;
220+
}
209221
$driver->addDriver($this->getDriver($nestedOmDriver), $namespace);
210222
}
211-
if (null !== $omDriver->getDefaultDriver()) {
212-
$driver->setDefaultDriver($this->getDriver($omDriver->getDefaultDriver()));
223+
if ($attributeDriver || null !== $omDriver->getDefaultDriver()) {
224+
$defDriver = $omDriver->getDefaultDriver();
225+
if (!$defDriver instanceof AttributeDriver && $attributeDriver) {
226+
$defDriver = $attributeDriver;
227+
}
228+
$driver->setDefaultDriver($this->getDriver($defDriver));
213229
}
214230
} else {
215231
$driverName = substr($driverName, 0, strpos($driverName, 'Driver'));

src/Mapping/MappedEventSubscriber.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,22 @@ abstract class MappedEventSubscriber implements EventSubscriber
9999

100100
private ?ClockInterface $clock = null;
101101

102+
/**
103+
* Ignore doctrine driver class and force use attribute reader for gedmo properties
104+
* @var bool
105+
*/
106+
private $forceUseAttributeReader = false;
107+
102108
public function __construct()
103109
{
104110
$parts = explode('\\', $this->getNamespace());
105111
$this->name = end($parts);
106112
}
107113

114+
public function setForceUseAttributeReader(bool $forceUseAttributeReader) {
115+
$this->forceUseAttributeReader = $forceUseAttributeReader;
116+
}
117+
108118
/**
109119
* Get the configuration for specific object class
110120
* if cache driver is present it scans it also
@@ -166,7 +176,8 @@ public function getExtensionMetadataFactory(ObjectManager $objectManager)
166176
$objectManager,
167177
$this->getNamespace(),
168178
$this->annotationReader,
169-
$this->getCacheItemPool($objectManager)
179+
$this->getCacheItemPool($objectManager),
180+
$this->forceUseAttributeReader
170181
);
171182
}
172183

0 commit comments

Comments
 (0)