/** * @param ServiceLocatorInterface $sl * @param DriverOptions $options * @throws InvalidArgumentException * @return MappingDriver */ protected function createDriver(ServiceLocatorInterface $sl, DriverOptions $options) { $class = $options->getClass(); if (!$class) { throw new InvalidArgumentException('Drivers must specify a class'); } if (!class_exists($class)) { throw new InvalidArgumentException(sprintf('Driver with type "%s" could not be found', $class)); } // Not all drivers (DriverChain) require paths. $paths = $options->getPaths(); // Special options for AnnotationDrivers. if ('Doctrine\\Common\\Persistence\\Mapping\\Driver\\AnnotationDriver' === $class || is_subclass_of($class, 'Doctrine\\Common\\Persistence\\Mapping\\Driver\\AnnotationDriver')) { $reader = new Annotations\AnnotationReader(); $reader = new Annotations\CachedReader(new Annotations\IndexedReader($reader), $sl->get($options->getCache())); /* @var $driver MappingDriver */ $driver = new $class($reader, $paths); } else { /* @var $driver MappingDriver */ $driver = new $class($paths); } if ($options->getExtension() && $driver instanceof FileDriver) { /* @var $driver FileDriver */ /* @var $locator \Doctrine\Common\Persistence\Mapping\Driver\FileLocator */ $locator = $driver->getLocator(); if (get_class($locator) === 'Doctrine\\Common\\Persistence\\Mapping\\Driver\\DefaultFileLocator') { $driver->setLocator(new DefaultFileLocator($locator->getPaths(), $options->getExtension())); } else { throw new InvalidArgumentException(sprintf('Discovered file locator for driver of type "%s" is an instance of "%s". This factory ' . 'supports only the DefaultFileLocator when an extension is set for the file locator', get_class($driver), get_class($locator))); } } // Extra post-create options for DriverChain. if ($driver instanceof MappingDriverChain && $options->getDrivers()) { /* @var $driver \Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain */ $drivers = $options->getDrivers(); if (!is_array($drivers)) { $drivers = array($drivers); } foreach ($drivers as $namespace => $driverName) { if (null === $driverName) { continue; } $options = $this->getOptions($sl, 'driver', $driverName); $driver->addDriver($this->createDriver($sl, $options), $namespace); } } return $driver; }
/** * @param ServiceLocatorInterface $sl * @param Driver $options * @return mixed * @throws \InvalidArgumentException */ protected function createDriver(ServiceLocatorInterface $sl, DriverOptions $options) { $class = $options->getClass(); if (!$class) { throw new InvalidArgumentException('Drivers must specify a class'); } if (!class_exists($class)) { throw new InvalidArgumentException(sprintf('Driver with type "%s" could not be found', $class)); } // Not all drivers (DriverChain) require paths. $paths = $options->getPaths(); // Special options for AnnotationDrivers. if ($class == 'Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver' || is_subclass_of($class, 'Doctrine\\ORM\\Mapping\\Driver\\AnnotationDriver')) { $reader = new Annotations\AnnotationReader(); $reader = new Annotations\CachedReader(new Annotations\IndexedReader($reader), $sl->get($options->getCache())); $driver = new $class($reader, $paths); } else { $driver = new $class($paths); } // File-drivers allow extensions. if ($options->getExtension() && method_exists($driver, 'setFileExtension')) { $driver->setFileExtension($options->getExtension()); } // Extra post-create options for DriverChain. if ($driver instanceof \Doctrine\ORM\Mapping\Driver\DriverChain && $options->getDrivers()) { $drivers = $options->getDrivers(); if (!is_array($drivers)) { $drivers = array($drivers); } foreach ($drivers as $namespace => $driverName) { $options = $this->getOptions($sl, 'driver', $driverName); $driver->addDriver($this->createDriver($sl, $options), $namespace); } } return $driver; }