Nette\DI\PhpGenerator::generate PHP Метод

generate() публичный Метод

Generates PHP classes. First class is the container.
public generate ( $className ) : ClassType[]
Результат 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;
    }

Usage Example

Пример #1
0
 /** @internal */
 public function generateCode()
 {
     if (func_num_args()) {
         trigger_error(__METHOD__ . ' arguments are deprecated, use Compiler::setClassName().', E_USER_DEPRECATED);
         $this->className = func_get_arg(0) ?: $this->className;
     }
     $this->builder->prepareClassList();
     foreach ($this->extensions as $extension) {
         $extension->beforeCompile();
         $this->dependencies->add([(new \ReflectionClass($extension))->getFileName()]);
     }
     $generator = new PhpGenerator($this->builder);
     $classes = $generator->generate($this->className);
     $classes[0]->addMethod('initialize');
     $this->dependencies->add($this->builder->getDependencies());
     foreach ($this->extensions as $extension) {
         $extension->afterCompile($classes[0]);
     }
     return $classes;
 }