1515use Doctrine \ODM \MongoDB \Mapping \ClassMetadata as DocumentClassMetadata ;
1616use Doctrine \ORM \Mapping \ClassMetadata as EntityClassMetadata ;
1717use Doctrine \ORM \Mapping \ClassMetadataInfo as LegacyEntityClassMetadata ;
18+ use Doctrine \ORM \Mapping \Driver \AttributeDriver ;
1819use Doctrine \Persistence \Mapping \ClassMetadata ;
1920use Doctrine \Persistence \Mapping \Driver \DefaultFileLocator ;
2021use Doctrine \Persistence \Mapping \Driver \MappingDriver ;
@@ -70,10 +71,22 @@ 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+
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+
7386 /**
7487 * @param Reader|AttributeReader|object|null $annotationReader
7588 */
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 )
7790 {
7891 if (null !== $ annotationReader && !$ annotationReader instanceof Reader && !$ annotationReader instanceof AttributeReader) {
7992 Deprecation::trigger (
@@ -89,6 +102,9 @@ public function __construct(ObjectManager $objectManager, string $extensionNames
89102 $ this ->objectManager = $ objectManager ;
90103 $ this ->annotationReader = $ annotationReader ;
91104 $ this ->extensionNamespace = $ extensionNamespace ;
105+ $ this ->forceUseAttributeReader = $ forceUseAttributeReader ;
106+ $ this ->separateXmlMapping = $ separateXmlMapping ;
107+
92108 $ omDriver = $ objectManager ->getConfiguration ()->getMetadataDriverImpl ();
93109 $ this ->driver = $ this ->getDriver ($ omDriver );
94110 $ this ->cacheItemPool = $ cacheItemPool ;
@@ -172,6 +188,10 @@ public static function getCacheId($className, $extensionNamespace)
172188 return str_replace ('\\' , '_ ' , $ className ).'_$ ' .strtoupper (str_replace ('\\' , '_ ' , $ extensionNamespace )).'_CLASSMETADATA ' ;
173189 }
174190
191+ private function getFileExtension ($ fileExtension )
192+ {
193+ return $ this ->separateXmlMapping ? str_replace (['.orm. ' ,'.dcm. ' ], '.gedmo. ' , $ fileExtension ) : $ fileExtension ;
194+ }
175195 /**
176196 * Get the extended driver instance which will
177197 * read the metadata required by extension
@@ -193,11 +213,12 @@ protected function getDriver($omDriver)
193213 $ driverName = substr ($ className , strrpos ($ className , '\\' ) + 1 );
194214 if ($ omDriver instanceof MappingDriverChain || 'DriverChain ' === $ driverName ) {
195215 $ driver = new Chain ();
216+ $ attributeDriver = $ this ->forceUseAttributeReader ? new AttributeDriver ([]) : null ;
196217 foreach ($ omDriver ->getDrivers () as $ namespace => $ nestedOmDriver ) {
197- $ driver ->addDriver ($ this ->getDriver ($ nestedOmDriver ), $ namespace );
218+ $ driver ->addDriver ($ this ->getDriver ($ attributeDriver ?? $ nestedOmDriver ), $ namespace );
198219 }
199220 if (null !== $ omDriver ->getDefaultDriver ()) {
200- $ driver ->setDefaultDriver ($ this ->getDriver ($ omDriver ->getDefaultDriver ()));
221+ $ driver ->setDefaultDriver ($ this ->getDriver ($ attributeDriver ?? $ omDriver ->getDefaultDriver ()));
201222 }
202223 } else {
203224 $ driverName = substr ($ driverName , 0 , strpos ($ driverName , 'Driver ' ));
@@ -231,12 +252,14 @@ protected function getDriver($omDriver)
231252 $ driver ->setOriginalDriver ($ omDriver );
232253 if ($ driver instanceof FileDriver) {
233254 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 );
235258 // BC for Doctrine 2.2
236259 } elseif ($ isSimplified ) {
237- $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ omDriver ->getFileExtension ()));
260+ $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
238261 } else {
239- $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ omDriver ->getFileExtension ()));
262+ $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
240263 }
241264 }
242265
0 commit comments