1414use Doctrine \ODM \MongoDB \Mapping \ClassMetadata as DocumentClassMetadata ;
1515use Doctrine \ORM \Mapping \ClassMetadata as EntityClassMetadata ;
1616use Doctrine \ORM \Mapping \ClassMetadataInfo as LegacyEntityClassMetadata ;
17+ use Doctrine \ORM \Mapping \Driver \AttributeDriver ;
1718use Doctrine \Persistence \Mapping \ClassMetadata ;
1819use Doctrine \Persistence \Mapping \Driver \DefaultFileLocator ;
1920use Doctrine \Persistence \Mapping \Driver \MappingDriver ;
@@ -69,10 +70,22 @@ class ExtensionMetadataFactory
6970
7071 private ?CacheItemPoolInterface $ cacheItemPool = null ;
7172
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+
7285 /**
7386 * @param Reader|AttributeReader|object|null $annotationReader
7487 */
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 )
7689 {
7790 if (null !== $ annotationReader && !$ annotationReader instanceof Reader && !$ annotationReader instanceof AttributeReader) {
7891 trigger_deprecation (
@@ -88,6 +101,9 @@ public function __construct(ObjectManager $objectManager, string $extensionNames
88101 $ this ->objectManager = $ objectManager ;
89102 $ this ->annotationReader = $ annotationReader ;
90103 $ this ->extensionNamespace = $ extensionNamespace ;
104+ $ this ->forceUseAttributeReader = $ forceUseAttributeReader ;
105+ $ this ->separateXmlMapping = $ separateXmlMapping ;
106+
91107 $ omDriver = $ objectManager ->getConfiguration ()->getMetadataDriverImpl ();
92108 $ this ->driver = $ this ->getDriver ($ omDriver );
93109 $ this ->cacheItemPool = $ cacheItemPool ;
@@ -171,6 +187,10 @@ public static function getCacheId($className, $extensionNamespace)
171187 return str_replace ('\\' , '_ ' , $ className ).'_$ ' .strtoupper (str_replace ('\\' , '_ ' , $ extensionNamespace )).'_CLASSMETADATA ' ;
172188 }
173189
190+ private function getFileExtension ($ fileExtension )
191+ {
192+ return $ this ->separateXmlMapping ? str_replace (['.orm. ' ,'.dcm. ' ], '.gedmo. ' , $ fileExtension ) : $ fileExtension ;
193+ }
174194 /**
175195 * Get the extended driver instance which will
176196 * read the metadata required by extension
@@ -192,11 +212,12 @@ protected function getDriver($omDriver)
192212 $ driverName = substr ($ className , strrpos ($ className , '\\' ) + 1 );
193213 if ($ omDriver instanceof MappingDriverChain || 'DriverChain ' === $ driverName ) {
194214 $ driver = new Chain ();
215+ $ attributeDriver = $ this ->forceUseAttributeReader ? new AttributeDriver ([]) : null ;
195216 foreach ($ omDriver ->getDrivers () as $ namespace => $ nestedOmDriver ) {
196- $ driver ->addDriver ($ this ->getDriver ($ nestedOmDriver ), $ namespace );
217+ $ driver ->addDriver ($ this ->getDriver ($ attributeDriver ?? $ nestedOmDriver ), $ namespace );
197218 }
198219 if (null !== $ omDriver ->getDefaultDriver ()) {
199- $ driver ->setDefaultDriver ($ this ->getDriver ($ omDriver ->getDefaultDriver ()));
220+ $ driver ->setDefaultDriver ($ this ->getDriver ($ attributeDriver ?? $ omDriver ->getDefaultDriver ()));
200221 }
201222 } else {
202223 $ driverName = substr ($ driverName , 0 , strpos ($ driverName , 'Driver ' ));
@@ -230,12 +251,14 @@ protected function getDriver($omDriver)
230251 $ driver ->setOriginalDriver ($ omDriver );
231252 if ($ driver instanceof FileDriver) {
232253 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 );
234257 // BC for Doctrine 2.2
235258 } elseif ($ isSimplified ) {
236- $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ omDriver ->getFileExtension ()));
259+ $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
237260 } else {
238- $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ omDriver ->getFileExtension ()));
261+ $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
239262 }
240263 }
241264
0 commit comments