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