Kdyby\Doctrine\DI\OrmExtension::processRepositories PHP Method

processRepositories() protected method

protected processRepositories ( )
    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')]);
        }
    }