1313use Doctrine \Common \Annotations \Reader ;
1414use Doctrine \ODM \MongoDB \Mapping \ClassMetadata as DocumentClassMetadata ;
1515use Doctrine \ORM \Mapping \ClassMetadataInfo as EntityClassMetadata ;
16+ use Doctrine \ORM \Mapping \Driver \AttributeDriver ;
1617use Doctrine \Persistence \Mapping \ClassMetadata ;
1718use Doctrine \Persistence \Mapping \Driver \DefaultFileLocator ;
1819use Doctrine \Persistence \Mapping \Driver \MappingDriver ;
@@ -71,10 +72,22 @@ class ExtensionMetadataFactory
7172 */
7273 private $ cacheItemPool ;
7374
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+
7487 /**
7588 * @param Reader|AttributeReader|object $annotationReader
7689 */
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 )
7891 {
7992 if (!$ annotationReader instanceof Reader && !$ annotationReader instanceof AttributeReader) {
8093 trigger_deprecation (
@@ -90,6 +103,9 @@ public function __construct(ObjectManager $objectManager, string $extensionNames
90103 $ this ->objectManager = $ objectManager ;
91104 $ this ->annotationReader = $ annotationReader ;
92105 $ this ->extensionNamespace = $ extensionNamespace ;
106+ $ this ->forceUseAttributeReader = $ forceUseAttributeReader ;
107+ $ this ->separateXmlMapping = $ separateXmlMapping ;
108+
93109 $ omDriver = $ objectManager ->getConfiguration ()->getMetadataDriverImpl ();
94110 $ this ->driver = $ this ->getDriver ($ omDriver );
95111 $ this ->cacheItemPool = $ cacheItemPool ;
@@ -173,6 +189,10 @@ public static function getCacheId($className, $extensionNamespace)
173189 return str_replace ('\\' , '_ ' , $ className ).'_$ ' .strtoupper (str_replace ('\\' , '_ ' , $ extensionNamespace )).'_CLASSMETADATA ' ;
174190 }
175191
192+ private function getFileExtension ($ fileExtension )
193+ {
194+ return $ this ->separateXmlMapping ? str_replace (['.orm. ' ,'.dcm. ' ], '.gedmo. ' , $ fileExtension ) : $ fileExtension ;
195+ }
176196 /**
177197 * Get the extended driver instance which will
178198 * read the metadata required by extension
@@ -194,11 +214,12 @@ protected function getDriver($omDriver)
194214 $ driverName = substr ($ className , strrpos ($ className , '\\' ) + 1 );
195215 if ($ omDriver instanceof MappingDriverChain || 'DriverChain ' === $ driverName ) {
196216 $ driver = new Chain ();
217+ $ attributeDriver = $ this ->forceUseAttributeReader ? new AttributeDriver ([]) : null ;
197218 foreach ($ omDriver ->getDrivers () as $ namespace => $ nestedOmDriver ) {
198- $ driver ->addDriver ($ this ->getDriver ($ nestedOmDriver ), $ namespace );
219+ $ driver ->addDriver ($ this ->getDriver ($ attributeDriver ?? $ nestedOmDriver ), $ namespace );
199220 }
200221 if (null !== $ omDriver ->getDefaultDriver ()) {
201- $ driver ->setDefaultDriver ($ this ->getDriver ($ omDriver ->getDefaultDriver ()));
222+ $ driver ->setDefaultDriver ($ this ->getDriver ($ attributeDriver ?? $ omDriver ->getDefaultDriver ()));
202223 }
203224 } else {
204225 $ driverName = substr ($ driverName , 0 , strpos ($ driverName , 'Driver ' ));
@@ -220,12 +241,14 @@ protected function getDriver($omDriver)
220241 $ driver ->setOriginalDriver ($ omDriver );
221242 if ($ driver instanceof FileDriver) {
222243 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 );
224247 // BC for Doctrine 2.2
225248 } elseif ($ isSimplified ) {
226- $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ omDriver ->getFileExtension ()));
249+ $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
227250 } else {
228- $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ omDriver ->getFileExtension ()));
251+ $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
229252 }
230253 }
231254
0 commit comments