/** * Get the extended driver instance which will * read the metadata required by extension * * @param object $omDriver * @throws \Gedmo\Exception\RuntimeException if driver was not found in extension * @return \Gedmo\Mapping\Driver */ protected function getDriver($omDriver) { $driver = null; $className = get_class($omDriver); $driverName = substr($className, strrpos($className, '\\') + 1); if ($omDriver instanceof MappingDriverChain || $driverName == 'DriverChain') { $driver = new Driver\Chain(); foreach ($omDriver->getDrivers() as $namespace => $nestedOmDriver) { $driver->addDriver($this->getDriver($nestedOmDriver), $namespace); } if (version_compare(CommonLibVer::VERSION, '2.3.0', '>=') && $omDriver->getDefaultDriver() !== null) { $driver->setDefaultDriver($this->getDriver($omDriver->getDefaultDriver())); } } else { $driverName = substr($driverName, 0, strpos($driverName, 'Driver')); $isSimplified = false; if (substr($driverName, 0, 10) === 'Simplified') { // support for simplified file drivers $driverName = substr($driverName, 10); $isSimplified = true; } // create driver instance $driverClassName = $this->extensionNamespace . '\\Mapping\\Driver\\' . $driverName; if (!class_exists($driverClassName)) { $driverClassName = $this->extensionNamespace . '\\Mapping\\Driver\\Annotation'; if (!class_exists($driverClassName)) { throw new \Gedmo\Exception\RuntimeException("Failed to fallback to annotation driver: ({$driverClassName}), extension driver was not found."); } } $driver = new $driverClassName(); $driver->setOriginalDriver($omDriver); if ($driver instanceof FileDriver) { /** @var $driver FileDriver */ if ($omDriver instanceof MappingDriver) { $driver->setLocator($omDriver->getLocator()); // BC for Doctrine 2.2 } elseif ($isSimplified) { $driver->setLocator(new SymfonyFileLocator($omDriver->getNamespacePrefixes(), $omDriver->getFileExtension())); } else { $driver->setLocator(new DefaultFileLocator($omDriver->getPaths(), $omDriver->getFileExtension())); } } if ($driver instanceof AnnotationDriverInterface) { $driver->setAnnotationReader($this->annotationReader); } } return $driver; }