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,12 +71,24 @@ 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 *
7689 * @note Providing any object as the third argument is deprecated, as of 4.0 an {@see AttributeReader} will be required
7790 */
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 )
7992 {
8093 if (null !== $ annotationReader ) {
8194 if ($ annotationReader instanceof Reader) {
@@ -101,6 +114,9 @@ public function __construct(ObjectManager $objectManager, string $extensionNames
101114 $ this ->objectManager = $ objectManager ;
102115 $ this ->annotationReader = $ annotationReader ;
103116 $ this ->extensionNamespace = $ extensionNamespace ;
117+ $ this ->forceUseAttributeReader = $ forceUseAttributeReader ;
118+ $ this ->separateXmlMapping = $ separateXmlMapping ;
119+
104120 $ omDriver = $ objectManager ->getConfiguration ()->getMetadataDriverImpl ();
105121 $ this ->driver = $ this ->getDriver ($ omDriver );
106122 $ this ->cacheItemPool = $ cacheItemPool ;
@@ -184,6 +200,10 @@ public static function getCacheId($className, $extensionNamespace)
184200 return str_replace ('\\' , '_ ' , $ className ).'_$ ' .strtoupper (str_replace ('\\' , '_ ' , $ extensionNamespace )).'_CLASSMETADATA ' ;
185201 }
186202
203+ private function getFileExtension ($ fileExtension )
204+ {
205+ return $ this ->separateXmlMapping ? str_replace (['.orm. ' ,'.dcm. ' ], '.gedmo. ' , $ fileExtension ) : $ fileExtension ;
206+ }
187207 /**
188208 * Get the extended driver instance which will
189209 * read the metadata required by extension
@@ -205,11 +225,12 @@ protected function getDriver($omDriver)
205225 $ driverName = substr ($ className , strrpos ($ className , '\\' ) + 1 );
206226 if ($ omDriver instanceof MappingDriverChain || 'DriverChain ' === $ driverName ) {
207227 $ driver = new Chain ();
228+ $ attributeDriver = $ this ->forceUseAttributeReader ? new AttributeDriver ([]) : null ;
208229 foreach ($ omDriver ->getDrivers () as $ namespace => $ nestedOmDriver ) {
209- $ driver ->addDriver ($ this ->getDriver ($ nestedOmDriver ), $ namespace );
230+ $ driver ->addDriver ($ this ->getDriver ($ attributeDriver ?? $ nestedOmDriver ), $ namespace );
210231 }
211232 if (null !== $ omDriver ->getDefaultDriver ()) {
212- $ driver ->setDefaultDriver ($ this ->getDriver ($ omDriver ->getDefaultDriver ()));
233+ $ driver ->setDefaultDriver ($ this ->getDriver ($ attributeDriver ?? $ omDriver ->getDefaultDriver ()));
213234 }
214235 } else {
215236 $ driverName = substr ($ driverName , 0 , strpos ($ driverName , 'Driver ' ));
@@ -243,12 +264,14 @@ protected function getDriver($omDriver)
243264 $ driver ->setOriginalDriver ($ omDriver );
244265 if ($ driver instanceof FileDriver) {
245266 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 );
247270 // BC for Doctrine 2.2
248271 } elseif ($ isSimplified ) {
249- $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ omDriver ->getFileExtension ()));
272+ $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
250273 } else {
251- $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ omDriver ->getFileExtension ()));
274+ $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
252275 }
253276 }
254277
0 commit comments