protected function processMetadataDriver(Nette\DI\ServiceDefinition $metadataDriver, $namespace, $driver, $prefix)
{
if (!is_string($namespace) || !Strings::match($namespace, '#^' . self::PHP_NAMESPACE . '\\z#')) {
throw new Nette\Utils\AssertionException("The metadata namespace expects to be valid namespace, {$namespace} given.");
}
$namespace = ltrim($namespace, '\\');
if (is_string($driver) || is_array($driver)) {
$paths = is_array($driver) ? $driver : [$driver];
foreach ($paths as $path) {
if (($pos = strrpos($path, '*')) !== FALSE) {
$path = substr($path, 0, $pos);
}
if (!file_exists($path)) {
throw new Nette\Utils\AssertionException("The metadata path expects to be an existing directory, {$path} given.");
}
}
$driver = new Statement(self::ANNOTATION_DRIVER, is_array($paths) ? $paths : [$paths]);
}
$impl = $driver instanceof \stdClass ? $driver->value : ($driver instanceof Statement ? $driver->getEntity() : (string) $driver);
list($driver) = CacheHelpers::filterArgs($driver);
/** @var Statement $driver */
/** @var string $impl */
if (isset($this->metadataDriverClasses[$impl])) {
$driver = new Statement($this->metadataDriverClasses[$impl], $driver->arguments);
}
if (is_string($driver->getEntity()) && substr($driver->getEntity(), 0, 1) === '@') {
$metadataDriver->addSetup('addDriver', [$driver->getEntity(), $namespace]);
return $driver->getEntity();
}
if ($impl === self::ANNOTATION_DRIVER) {
$driver->arguments = [Nette\Utils\Arrays::flatten($driver->arguments), 2 => $this->prefix('@cache.' . $prefix . '.metadata')];
}
$serviceName = $this->prefix($prefix . '.driver.' . str_replace('\\', '_', $namespace) . '.' . str_replace('\\', '_', $impl) . 'Impl');
$this->getContainerBuilder()->addDefinition($serviceName)->setClass('Doctrine\\Common\\Persistence\\Mapping\\Driver\\MappingDriver')->setFactory($driver->getEntity(), $driver->arguments)->setAutowired(FALSE)->setInject(FALSE);
$metadataDriver->addSetup('addDriver', ['@' . $serviceName, $namespace]);
return '@' . $serviceName;
}