/** * Generates PHP classes. First class is the container. * @return Nette\PhpGenerator\ClassType[] */ public function generate($className) { $this->builder->complete(); $this->generatedClasses = []; $this->className = $className; $containerClass = $this->generatedClasses[] = new Nette\PhpGenerator\ClassType($this->className); $containerClass->setExtends(Container::class); $containerClass->addMethod('__construct')->addBody('parent::__construct(?);', [$this->builder->parameters]); $definitions = $this->builder->getDefinitions(); ksort($definitions); $meta = $containerClass->addProperty('meta')->setVisibility('protected')->setValue([Container::TYPES => $this->builder->getClassList()]); foreach ($definitions as $name => $def) { $meta->value[Container::SERVICES][$name] = $def->getClass() ?: NULL; foreach ($def->getTags() as $tag => $value) { $meta->value[Container::TAGS][$tag][$name] = $value; } } foreach ($definitions as $name => $def) { try { $name = (string) $name; $methodName = Container::getMethodName($name); if (!PhpHelpers::isIdentifier($methodName)) { throw new ServiceCreationException('Name contains invalid characters.'); } $containerClass->addMethod($methodName)->addComment('@return ' . ($def->getImplement() ?: $def->getClass()))->setBody($name === ContainerBuilder::THIS_CONTAINER ? 'return $this;' : $this->generateService($name))->setParameters($def->getImplement() ? [] : $this->convertParameters($def->parameters)); } catch (\Exception $e) { throw new ServiceCreationException("Service '{$name}': " . $e->getMessage(), 0, $e); } } $aliases = $this->builder->getAliases(); ksort($aliases); $meta->value[Container::ALIASES] = $aliases; return $this->generatedClasses; }