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 ;
@@ -155,6 +171,10 @@ public static function getCacheId($className, $extensionNamespace)
155171 return str_replace ('\\' , '_ ' , $ className ).'_$ ' .strtoupper (str_replace ('\\' , '_ ' , $ extensionNamespace )).'_CLASSMETADATA ' ;
156172 }
157173
174+ private function getFileExtension ($ fileExtension )
175+ {
176+ return $ this ->separateXmlMapping ? str_replace (['.orm. ' ,'.dcm. ' ], '.gedmo. ' , $ fileExtension ) : $ fileExtension ;
177+ }
158178 /**
159179 * Get the extended driver instance which will
160180 * read the metadata required by extension
@@ -176,11 +196,12 @@ protected function getDriver($omDriver)
176196 $ driverName = substr ($ className , strrpos ($ className , '\\' ) + 1 );
177197 if ($ omDriver instanceof MappingDriverChain || 'DriverChain ' === $ driverName ) {
178198 $ driver = new Chain ();
199+ $ attributeDriver = $ this ->forceUseAttributeReader ? new AttributeDriver ([]) : null ;
179200 foreach ($ omDriver ->getDrivers () as $ namespace => $ nestedOmDriver ) {
180- $ driver ->addDriver ($ this ->getDriver ($ nestedOmDriver ), $ namespace );
201+ $ driver ->addDriver ($ this ->getDriver ($ attributeDriver ?? $ nestedOmDriver ), $ namespace );
181202 }
182203 if (null !== $ omDriver ->getDefaultDriver ()) {
183- $ driver ->setDefaultDriver ($ this ->getDriver ($ omDriver ->getDefaultDriver ()));
204+ $ driver ->setDefaultDriver ($ this ->getDriver ($ attributeDriver ?? $ omDriver ->getDefaultDriver ()));
184205 }
185206 } else {
186207 $ driverName = substr ($ driverName , 0 , strpos ($ driverName , 'Driver ' ));
@@ -202,12 +223,14 @@ protected function getDriver($omDriver)
202223 $ driver ->setOriginalDriver ($ omDriver );
203224 if ($ driver instanceof FileDriver) {
204225 if ($ omDriver instanceof MappingDriver) {
205- $ driver ->setLocator ($ omDriver ->getLocator ());
226+ $ locator = clone $ omDriver ->getLocator ();
227+ $ locator ->setFileExtension ($ this ->getFileExtension ( $ locator ->getFileExtension ()));
228+ $ driver ->setLocator ($ locator );
206229 // BC for Doctrine 2.2
207230 } elseif ($ isSimplified ) {
208- $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ omDriver ->getFileExtension ()));
231+ $ driver ->setLocator (new SymfonyFileLocator ($ omDriver ->getNamespacePrefixes (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
209232 } else {
210- $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ omDriver ->getFileExtension ()));
233+ $ driver ->setLocator (new DefaultFileLocator ($ omDriver ->getPaths (), $ this -> getFileExtension ( $ omDriver ->getFileExtension () )));
211234 }
212235 }
213236
0 commit comments