protected function processRepositories()
{
$builder = $this->getContainerBuilder();
$disabled = TRUE;
foreach ($this->configuredManagers as $managerName => $_) {
$factoryClassName = $builder->getDefinition($this->prefix($managerName . '.repositoryFactory'))->getClass();
if ($factoryClassName === 'Kdyby\\Doctrine\\RepositoryFactory' || in_array('Kdyby\\Doctrine\\RepositoryFactory', class_parents($factoryClassName), TRUE)) {
$disabled = FALSE;
}
}
if ($disabled) {
return;
}
if (!method_exists($builder, 'findByType')) {
foreach ($this->configuredManagers as $managerName => $_) {
$builder->getDefinition($this->prefix($managerName . '.repositoryFactory'))->addSetup('setServiceIdsMap', [[], $this->prefix('repositoryFactory.' . $managerName . '.defaultRepositoryFactory')]);
}
return;
}
$serviceMap = array_fill_keys(array_keys($this->configuredManagers), []);
foreach ($builder->findByType('Doctrine\\ORM\\EntityRepository', FALSE) as $originalServiceName => $originalDef) {
if (is_string($originalDef)) {
$originalServiceName = $originalDef;
$originalDef = $builder->getDefinition($originalServiceName);
}
if (strpos($originalServiceName, $this->name . '.') === 0) {
continue;
// ignore
}
$factory = $originalDef->getFactory() ? $originalDef->getFactory()->getEntity() : $originalDef->getClass();
if (stripos($factory, '::getRepository') !== FALSE) {
continue;
// ignore
}
$factoryServiceName = $this->prefix('repositoryFactory.' . $originalServiceName);
$factoryDef = $builder->addDefinition($factoryServiceName, $originalDef)->setImplement('Kdyby\\Doctrine\\DI\\IRepositoryFactory')->setParameters(['Doctrine\\ORM\\EntityManagerInterface entityManager', 'Doctrine\\ORM\\Mapping\\ClassMetadata classMetadata'])->setAutowired(FALSE);
$factoryStatement = $factoryDef->getFactory() ?: new Statement($factoryDef->getClass());
$factoryStatement->arguments[0] = new Code\PhpLiteral('$entityManager');
$factoryStatement->arguments[1] = new Code\PhpLiteral('$classMetadata');
$factoryDef->setArguments($factoryStatement->arguments);
$boundManagers = $this->getServiceBoundManagers($originalDef);
Validators::assert($boundManagers, 'list:1', 'bound manager');
if ($boundEntity = $originalDef->getTag(self::TAG_REPOSITORY_ENTITY)) {
if (!is_string($boundEntity) || !class_exists($boundEntity)) {
throw new Nette\Utils\AssertionException(sprintf('The entity "%s" for repository "%s" cannot be autoloaded.', $boundEntity, $originalDef->getClass()));
}
$entityArgument = $boundEntity;
} else {
$entityArgument = new Code\PhpLiteral('"%entityName%"');
$this->postCompileRepositoriesQueue[$boundManagers[0]][] = [ltrim($originalDef->getClass(), '\\'), $originalServiceName];
}
$builder->removeDefinition($originalServiceName);
$builder->addDefinition($originalServiceName)->setClass($originalDef->getClass())->setFactory(sprintf('@%s::getRepository', $this->configuredManagers[$boundManagers[0]]), [$entityArgument]);
$serviceMap[$boundManagers[0]][$originalDef->getClass()] = $factoryServiceName;
}
foreach ($this->configuredManagers as $managerName => $_) {
$builder->getDefinition($this->prefix($managerName . '.repositoryFactory'))->addSetup('setServiceIdsMap', [$serviceMap[$managerName], $this->prefix('repositoryFactory.' . $managerName . '.defaultRepositoryFactory')]);
}
}