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,12 +71,24 @@ 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
89
* @note Providing any object as the third argument is deprecated, as of 4.0 an {@see AttributeReader} will be required
77
90
*/
78
- public function __construct (ObjectManager $ objectManager , string $ extensionNamespace , ?object $ annotationReader = null , ?CacheItemPoolInterface $ cacheItemPool = null )
91
+ public function __construct (ObjectManager $ objectManager , string $ extensionNamespace , ?object $ annotationReader = null , ?CacheItemPoolInterface $ cacheItemPool = null , bool $ forceUseAttributeReader = false , bool $ separateXmlMapping = false )
79
92
{
80
93
if (null !== $ annotationReader ) {
81
94
if ($ annotationReader instanceof Reader) {
@@ -101,6 +114,9 @@ public function __construct(ObjectManager $objectManager, string $extensionNames
101
114
$ this ->objectManager = $ objectManager ;
102
115
$ this ->annotationReader = $ annotationReader ;
103
116
$ this ->extensionNamespace = $ extensionNamespace ;
117
+ $ this ->forceUseAttributeReader = $ forceUseAttributeReader ;
118
+ $ this ->separateXmlMapping = $ separateXmlMapping ;
119
+
104
120
$ omDriver = $ objectManager ->getConfiguration ()->getMetadataDriverImpl ();
105
121
$ this ->driver = $ this ->getDriver ($ omDriver );
106
122
$ this ->cacheItemPool = $ cacheItemPool ;
@@ -184,6 +200,10 @@ public static function getCacheId($className, $extensionNamespace)
184
200
return str_replace ('\\' , '_ ' , $ className ).'_$ ' .strtoupper (str_replace ('\\' , '_ ' , $ extensionNamespace )).'_CLASSMETADATA ' ;
185
201
}
186
202
203
+ private function getFileExtension ($ fileExtension )
204
+ {
205
+ return $ this ->separateXmlMapping ? str_replace (['.orm. ' ,'.dcm. ' ], '.gedmo. ' , $ fileExtension ) : $ fileExtension ;
206
+ }
187
207
/**
188
208
* Get the extended driver instance which will
189
209
* read the metadata required by extension
@@ -205,11 +225,12 @@ protected function getDriver($omDriver)
205
225
$ driverName = substr ($ className , strrpos ($ className , '\\' ) + 1 );
206
226
if ($ omDriver instanceof MappingDriverChain || 'DriverChain ' === $ driverName ) {
207
227
$ driver = new Chain ();
228
+ $ attributeDriver = $ this ->forceUseAttributeReader ? new AttributeDriver ([]) : null ;
208
229
foreach ($ omDriver ->getDrivers () as $ namespace => $ nestedOmDriver ) {
209
- $ driver ->addDriver ($ this ->getDriver ($ nestedOmDriver ), $ namespace );
230
+ $ driver ->addDriver ($ this ->getDriver ($ attributeDriver ?? $ nestedOmDriver ), $ namespace );
210
231
}
211
232
if (null !== $ omDriver ->getDefaultDriver ()) {
212
- $ driver ->setDefaultDriver ($ this ->getDriver ($ omDriver ->getDefaultDriver ()));
233
+ $ driver ->setDefaultDriver ($ this ->getDriver ($ attributeDriver ?? $ omDriver ->getDefaultDriver ()));
213
234
}
214
235
} else {
215
236
$ driverName = substr ($ driverName , 0 , strpos ($ driverName , 'Driver ' ));
@@ -243,12 +264,14 @@ protected function getDriver($omDriver)
243
264
$ driver ->setOriginalDriver ($ omDriver );
244
265
if ($ driver instanceof FileDriver) {
245
266
if ($ omDriver instanceof MappingDriver) {
246
- $ driver ->setLocator ($ omDriver ->getLocator ());
267
+ $ locator = clone $ omDriver ->getLocator ();
268
+ $ locator ->setFileExtension ($ this ->getFileExtension ( $ locator ->getFileExtension ()));
269
+ $ driver ->setLocator ($ locator );
247
270
// BC for Doctrine 2.2
248
271
} elseif ($ isSimplified ) {
249
- $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ omDriver ->getFileExtension ()));
272
+ $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
250
273
} else {
251
- $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ omDriver ->getFileExtension ()));
274
+ $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
252
275
}
253
276
}
254
277
0 commit comments