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