15
15
use Doctrine \ODM \MongoDB \Mapping \ClassMetadata as DocumentClassMetadata ;
16
16
use Doctrine \ORM \Mapping \ClassMetadata as EntityClassMetadata ;
17
17
use Doctrine \ORM \Mapping \ClassMetadataInfo as LegacyEntityClassMetadata ;
18
+ use Doctrine \ORM \Mapping \Driver \AttributeDriver ;
18
19
use Doctrine \Persistence \Mapping \ClassMetadata ;
19
20
use Doctrine \Persistence \Mapping \Driver \DefaultFileLocator ;
20
21
use Doctrine \Persistence \Mapping \Driver \MappingDriver ;
@@ -70,10 +71,22 @@ class ExtensionMetadataFactory
70
71
71
72
private ?CacheItemPoolInterface $ cacheItemPool = null ;
72
73
74
+ /**
75
+ * Ignore doctrine driver class and force use attribute reader for gedmo properties
76
+ * @var bool
77
+ */
78
+ private $ forceUseAttributeReader ;
79
+
80
+ /**
81
+ * Search mapping in .gedmo.xml and does not use doctrine *.orm.xml or *.dcm.xml file
82
+ * @var bool
83
+ */
84
+ private $ separateXmlMapping ;
85
+
73
86
/**
74
87
* @param Reader|AttributeReader|object|null $annotationReader
75
88
*/
76
- public function __construct (ObjectManager $ objectManager , string $ extensionNamespace , ?object $ annotationReader = null , ?CacheItemPoolInterface $ cacheItemPool = null )
89
+ public function __construct (ObjectManager $ objectManager , string $ extensionNamespace , ?object $ annotationReader = null , ?CacheItemPoolInterface $ cacheItemPool = null , bool $ forceUseAttributeReader = false , bool $ separateXmlMapping = false )
77
90
{
78
91
if (null !== $ annotationReader && !$ annotationReader instanceof Reader && !$ annotationReader instanceof AttributeReader) {
79
92
Deprecation::trigger (
@@ -89,6 +102,9 @@ public function __construct(ObjectManager $objectManager, string $extensionNames
89
102
$ this ->objectManager = $ objectManager ;
90
103
$ this ->annotationReader = $ annotationReader ;
91
104
$ this ->extensionNamespace = $ extensionNamespace ;
105
+ $ this ->forceUseAttributeReader = $ forceUseAttributeReader ;
106
+ $ this ->separateXmlMapping = $ separateXmlMapping ;
107
+
92
108
$ omDriver = $ objectManager ->getConfiguration ()->getMetadataDriverImpl ();
93
109
$ this ->driver = $ this ->getDriver ($ omDriver );
94
110
$ this ->cacheItemPool = $ cacheItemPool ;
@@ -172,6 +188,10 @@ public static function getCacheId($className, $extensionNamespace)
172
188
return str_replace ('\\' , '_ ' , $ className ).'_$ ' .strtoupper (str_replace ('\\' , '_ ' , $ extensionNamespace )).'_CLASSMETADATA ' ;
173
189
}
174
190
191
+ private function getFileExtension ($ fileExtension )
192
+ {
193
+ return $ this ->separateXmlMapping ? str_replace (['.orm. ' ,'.dcm. ' ], '.gedmo. ' , $ fileExtension ) : $ fileExtension ;
194
+ }
175
195
/**
176
196
* Get the extended driver instance which will
177
197
* read the metadata required by extension
@@ -193,11 +213,12 @@ protected function getDriver($omDriver)
193
213
$ driverName = substr ($ className , strrpos ($ className , '\\' ) + 1 );
194
214
if ($ omDriver instanceof MappingDriverChain || 'DriverChain ' === $ driverName ) {
195
215
$ driver = new Chain ();
216
+ $ attributeDriver = $ this ->forceUseAttributeReader ? new AttributeDriver ([]) : null ;
196
217
foreach ($ omDriver ->getDrivers () as $ namespace => $ nestedOmDriver ) {
197
- $ driver ->addDriver ($ this ->getDriver ($ nestedOmDriver ), $ namespace );
218
+ $ driver ->addDriver ($ this ->getDriver ($ attributeDriver ?? $ nestedOmDriver ), $ namespace );
198
219
}
199
220
if (null !== $ omDriver ->getDefaultDriver ()) {
200
- $ driver ->setDefaultDriver ($ this ->getDriver ($ omDriver ->getDefaultDriver ()));
221
+ $ driver ->setDefaultDriver ($ this ->getDriver ($ attributeDriver ?? $ omDriver ->getDefaultDriver ()));
201
222
}
202
223
} else {
203
224
$ driverName = substr ($ driverName , 0 , strpos ($ driverName , 'Driver ' ));
@@ -231,12 +252,14 @@ protected function getDriver($omDriver)
231
252
$ driver ->setOriginalDriver ($ omDriver );
232
253
if ($ driver instanceof FileDriver) {
233
254
if ($ omDriver instanceof MappingDriver) {
234
- $ driver ->setLocator ($ omDriver ->getLocator ());
255
+ $ locator = clone $ omDriver ->getLocator ();
256
+ $ locator ->setFileExtension ($ this ->getFileExtension ( $ locator ->getFileExtension ()));
257
+ $ driver ->setLocator ($ locator );
235
258
// BC for Doctrine 2.2
236
259
} elseif ($ isSimplified ) {
237
- $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ omDriver ->getFileExtension ()));
260
+ $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
238
261
} else {
239
- $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ omDriver ->getFileExtension ()));
262
+ $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
240
263
}
241
264
}
242
265
0 commit comments