/** * @param $version * @param $api * * @return string */ private function generateFileContent($version, $api) { $docBlock = new DocBlockGenerator('SellerCenter SDK Version Class', 'This file is auto generated, please do not edit it manually!!!'); $properties = [new PropertyGenerator('VERSION_NUMBER', $version, PropertyGenerator::FLAG_CONSTANT), new PropertyGenerator('API', $api, PropertyGenerator::FLAG_CONSTANT)]; $class = new ClassGenerator('Version', 'SellerCenter\\SDK', null, null, [], $properties, [], $docBlock); return $class->generate(); }
public function getClass() { $classGenerator = new ClassGenerator($this->collection, $this->namespace); $classGenerator->addUse('ArangoOdm\\Document', 'ArangoDoc'); $classGenerator->setExtendedClass('ArangoDoc'); $classGenerator->addMethods($this->getMethods()); return '<?php' . "\n\n" . $classGenerator->generate(); }
private function generateAutoLoaderClass() { $class = new ClassGenerator(); $class->setName('AutoLoader'); $class->setFinal(true); $class->setExtendedClass('BaseAutoLoader'); $class->addProperties([$this->generatePSR4MapProp(), $this->generatePSR0MapProp(), $this->generateClassMapProp(), $this->generateFileIncludesProp(), $this->generateProxiesMapProp()]); return $class->generate(); }
public function generate() { $gen = new ClassGenerator($this->name); $fnGetter = $this->fnGetter; foreach ($this->options["properties"] as $prop => $type) { $c = ucfirst($prop); $gen->addProperty($prop, null, PropertyGenerator::FLAG_PRIVATE); $gen->addMethod("get" . $c, [], MethodGenerator::FLAG_PUBLIC, $fnGetter($prop, $type), "???"); } return $gen->generate(); }
/** * Write generated code to disk and return the class code * * {@inheritDoc} */ public function generate(ClassGenerator $classGenerator) { $className = trim($classGenerator->getNamespaceName(), '\\') . '\\' . trim($classGenerator->getName(), '\\'); $generatedCode = $classGenerator->generate(); $fileName = $this->fileLocator->getProxyFileName($className); $tmpFileName = $fileName . '.' . uniqid('', true); // renaming files is necessary to avoid race conditions when the same file is written multiple times // in a short time period file_put_contents($tmpFileName, "<?php\n\n" . $generatedCode); rename($tmpFileName, $fileName); return $generatedCode; }
/** * Write generated code to disk and return the class code * * {@inheritDoc} */ public function generate(ClassGenerator $classGenerator) { $className = trim($classGenerator->getNamespaceName(), '\\') . '\\' . trim($classGenerator->getName(), '\\'); $generatedCode = $classGenerator->generate(); $fileName = $this->fileLocator->getProxyFileName($className); set_error_handler($this->emptyErrorHandler); try { $this->writeFile("<?php\n\n" . $generatedCode, $fileName); } catch (FileNotWritableException $fileNotWritable) { restore_error_handler(); throw $fileNotWritable; } restore_error_handler(); return $generatedCode; }
/** * Evaluates the generated code before returning it * * {@inheritDoc} */ public function generate(ClassGenerator $classGenerator) { $code = $classGenerator->generate(); if (!$this->canEval) { // @codeCoverageIgnoreStart $fileName = sys_get_temp_dir() . '/EvaluatingGeneratorStrategy.php.tmp.' . uniqid('', true); file_put_contents($fileName, "<?php\n" . $code); require $fileName; unlink($fileName); return $code; // @codeCoverageIgnoreEnd } eval($code); return $code; }
/** * @param ClassGenerator $classGenerator * @return string * @throws FileNotWritableException */ public function generate(ClassGenerator $classGenerator) { $className = trim($classGenerator->getNamespaceName(), '\\') . '\\' . trim($classGenerator->getName(), '\\'); $generatedCode = $classGenerator->generate(); $fileName = $this->file->getProxyFileName($className); set_error_handler(function () { }); try { $this->write("<?php\n\n" . $generatedCode, $fileName); } catch (FileNotWritableException $exception) { throw $exception; } finally { restore_error_handler(); } return $fileName; }
/** * Dynamically scope an audit class */ public function loadClass($auditClassName, $type) { $foundClassName = false; foreach ($this->getAuditEntities() as $className => $classOptions) { if ($this->getAuditObjectManager()->getRepository('ZF\\Doctrine\\Audit\\Entity\\AuditEntity')->generateClassName($className) == $auditClassName) { $foundClassName = true; break; } } if (!$foundClassName) { return false; } // Get fields from target entity $metadataFactory = $this->getObjectManager()->getMetadataFactory(); $auditedClassMetadata = $metadataFactory->getMetadataFor($className); $fields = $auditedClassMetadata->getFieldNames(); $identifiers = $auditedClassMetadata->getFieldNames(); $auditClass = new ClassGenerator(); $auditClass->setNamespaceName("ZF\\Doctrine\\Audit\\RevisionEntity"); $auditClass->setName(str_replace('\\', '_', $className)); $auditClass->setExtendedClass('AbstractAudit'); // Add revision reference getter and setter $auditClass->addProperty('revisionEntity', null, PropertyGenerator::FLAG_PROTECTED); $auditClass->addMethod('getRevisionEntity', array(), MethodGenerator::FLAG_PUBLIC, " return \$this->revisionEntity;"); $auditClass->addMethod('setRevisionEntity', array('value'), MethodGenerator::FLAG_PUBLIC, " \$this->revisionEntity = \$value;\n\nreturn \$this;\n "); // Generate audit entity foreach ($fields as $field) { $auditClass->addProperty($field, null, PropertyGenerator::FLAG_PROTECTED); } foreach ($auditedClassMetadata->getAssociationNames() as $associationName) { $auditClass->addProperty($associationName, null, PropertyGenerator::FLAG_PROTECTED); $fields[] = $associationName; } $auditClass->addMethod('getAssociationMappings', array(), MethodGenerator::FLAG_PUBLIC, "return unserialize('" . serialize($auditedClassMetadata->getAssociationMappings()) . "');"); // Add exchange array method $setters = array(); foreach ($fields as $fieldName) { $setters[] = '$this->' . $fieldName . ' = (isset($data["' . $fieldName . '"])) ? $data["' . $fieldName . '"]: null;'; $arrayCopy[] = " \"{$fieldName}\"" . ' => $this->' . $fieldName; } $auditClass->addMethod('getArrayCopy', array(), MethodGenerator::FLAG_PUBLIC, "return array(\n" . implode(",\n", $arrayCopy) . "\n);"); $auditClass->addMethod('exchangeArray', array('data'), MethodGenerator::FLAG_PUBLIC, implode("\n", $setters)); // Add function to return the entity class this entity audits $auditClass->addMethod('getAuditedEntityClass', array(), MethodGenerator::FLAG_PUBLIC, " return '" . addslashes($className) . "';"); eval($auditClass->generate()); return true; }
/** * Generates a dynamic class implementing specified interfaces (and ServiceAwareInterface). * @return string class name */ public function build() { $generator = new ClassGenerator(uniqid('Proxy_'), 'SoPhp\\Rpc\\Proxy'); $generator->setImplementedInterfaces($this->getImplements()); $generator->setExtendedClass('\\SoPhp\\Rpc\\Proxy\\ProxyAbstract'); $source = $generator->generate(); $className = $generator->getNamespaceName() . '\\' . $generator->getName(); try { eval($source); } catch (\Exception $e) { throw new BuildFailed("Could not evaluate source code for proxy. " . $source, 0, $e); } if (!class_exists($className, false)) { throw new BuildFailed("Proxy class `{$className}` does not exist"); } return $className; }
/** * @group ZF2-151 */ public function testAddUses() { $classGenerator = new ClassGenerator(); $classGenerator->setName('My\Class'); $classGenerator->addUse('My\First\Use\Class'); $classGenerator->addUse('My\Second\Use\Class', 'MyAlias'); $generated = $classGenerator->generate(); $this->assertContains('use My\First\Use\Class;', $generated); $this->assertContains('use My\Second\Use\Class as MyAlias;', $generated); }
/** * @group namespace */ public function testPassingANamespacedClassnameShouldGenerateAClassnameWithoutItsNamespace() { $classGeneratorClass = new ClassGenerator(); $classGeneratorClass->setName('My\Namespaced\FunClass'); $received = $classGeneratorClass->generate(); $this->assertContains('class FunClass', $received, $received); }
/** * Dynamically scope an audit class * * @param string $className * @return false|string */ public function loadClass($className, $type) { $moduleOptions = \ZF\Doctrine\Audit\Module::getModuleOptions(); if (!$moduleOptions) { return; } $entityManager = $moduleOptions->getEntityManager(); $auditClass = new ClassGenerator(); // Build a discovered many to many join class $joinClasses = $moduleOptions->getJoinClasses(); if (in_array($className, array_keys($joinClasses))) { $auditClass->setNamespaceName("ZF\\Doctrine\\Audit\\Entity"); $auditClass->setName($className); $auditClass->setExtendedClass('AbstractAudit'); $auditClass->addProperty('id', null, PropertyGenerator::FLAG_PROTECTED); $auditClass->addProperty('targetRevisionEntity', null, PropertyGenerator::FLAG_PROTECTED); $auditClass->addProperty('sourceRevisionEntity', null, PropertyGenerator::FLAG_PROTECTED); $auditClass->addMethod('getTargetRevisionEntity', array(), MethodGenerator::FLAG_PUBLIC, 'return $this->targetRevisionEntity;'); $auditClass->addMethod('getSourceRevisionEntity', array(), MethodGenerator::FLAG_PUBLIC, 'return $this->sourceRevisionEntity;'); $auditClass->addMethod('getId', array(), MethodGenerator::FLAG_PUBLIC, 'return $this->id;'); $auditClass->addMethod('setTargetRevisionEntity', array(ParameterGenerator::fromArray(array('name' => 'value', 'type' => '\\ZF\\Doctrine\\Audit\\Entity\\RevisionEntity'))), MethodGenerator::FLAG_PUBLIC, '$this->targetRevisionEntity = $value;' . "\n" . 'return $this;'); $auditClass->addMethod('setSourceRevisionEntity', array(ParameterGenerator::fromArray(array('name' => 'value', 'type' => '\\ZF\\Doctrine\\Audit\\Entity\\RevisionEntity'))), MethodGenerator::FLAG_PUBLIC, '$this->sourceRevisionEntity = $value;' . "\n" . 'return $this;'); # print_r($auditClass->generate()); # die(); eval($auditClass->generate()); return; } // Add revision reference getter and setter $auditClass->addProperty($moduleOptions->getRevisionEntityFieldName(), null, PropertyGenerator::FLAG_PROTECTED); $auditClass->addMethod('get' . $moduleOptions->getRevisionEntityFieldName(), array(), MethodGenerator::FLAG_PUBLIC, " return \$this->" . $moduleOptions->getRevisionEntityFieldName() . ";"); $auditClass->addMethod('set' . $moduleOptions->getRevisionEntityFieldName(), array('value'), MethodGenerator::FLAG_PUBLIC, " \$this->" . $moduleOptions->getRevisionEntityFieldName() . " = \$value;\nreturn \$this;\r\n "); // Verify this autoloader is used for target class #FIXME: why is this sent work outside the set namespace? foreach ($moduleOptions->getAuditedClassNames() as $targetClass => $targetClassOptions) { $auditClassName = 'ZF\\Doctrine\\Audit\\Entity\\' . str_replace('\\', '_', $targetClass); if ($auditClassName == $className) { $currentClass = $targetClass; } $autoloadClasses[] = $auditClassName; } if (!in_array($className, $autoloadClasses)) { return; } // Get fields from target entity $metadataFactory = $entityManager->getMetadataFactory(); $auditedClassMetadata = $metadataFactory->getMetadataFor($currentClass); $fields = $auditedClassMetadata->getFieldNames(); $identifiers = $auditedClassMetadata->getFieldNames(); $service = \ZF\Doctrine\Audit\Module::getModuleOptions()->getAuditService(); // Generate audit entity foreach ($fields as $field) { $auditClass->addProperty($field, null, PropertyGenerator::FLAG_PROTECTED); } foreach ($auditedClassMetadata->getAssociationNames() as $associationName) { $auditClass->addProperty($associationName, null, PropertyGenerator::FLAG_PROTECTED); $fields[] = $associationName; } $auditClass->addMethod('getAssociationMappings', array(), MethodGenerator::FLAG_PUBLIC, "return unserialize('" . serialize($auditedClassMetadata->getAssociationMappings()) . "');"); // Add exchange array method $setters = array(); foreach ($fields as $fieldName) { $setters[] = '$this->' . $fieldName . ' = (isset($data["' . $fieldName . '"])) ? $data["' . $fieldName . '"]: null;'; $arrayCopy[] = " \"{$fieldName}\"" . ' => $this->' . $fieldName; } $auditClass->addMethod('getArrayCopy', array(), MethodGenerator::FLAG_PUBLIC, "return array(\n" . implode(",\n", $arrayCopy) . "\n);"); $auditClass->addMethod('exchangeArray', array('data'), MethodGenerator::FLAG_PUBLIC, implode("\n", $setters)); // Add function to return the entity class this entity audits $auditClass->addMethod('getAuditedEntityClass', array(), MethodGenerator::FLAG_PUBLIC, " return '" . addslashes($currentClass) . "';"); $auditClass->setNamespaceName("ZF\\Doctrine\\Audit\\Entity"); $auditClass->setName(str_replace('\\', '_', $currentClass)); $auditClass->setExtendedClass('AbstractAudit'); # $auditedClassMetadata = $metadataFactory->getMetadataFor($currentClass); $auditedClassMetadata = $metadataFactory->getMetadataFor($currentClass); foreach ($auditedClassMetadata->getAssociationMappings() as $mapping) { if (isset($mapping['joinTable']['name'])) { $auditJoinTableClassName = "ZF\\Doctrine\\Audit\\Entity\\" . str_replace('\\', '_', $mapping['joinTable']['name']); $auditEntities[] = $auditJoinTableClassName; $moduleOptions->addJoinClass($auditJoinTableClassName, $mapping); } } # if ($auditClass->getName() == 'AppleConnect_Entity_UserAuthenticationLog') { # echo '<pre>'; # echo($auditClass->generate()); # die(); # } eval($auditClass->generate()); # die(); return true; }
public function testGenerateClassAndAddMethod() { $classGenerator = new ClassGenerator(); $classGenerator->setName('MyClass'); $classGenerator->addMethod('methodOne'); $expected = <<<CODE class MyClass { public function methodOne() { } } CODE; $output = $classGenerator->generate(); $this->assertEquals($expected, $output); }
/** * Função geradora das entidades dos schemas e tabelas do banco de dados * * @return \Cityware\Generator\Adapter\ModelAdapter */ private function generatorClassEntity() { /* Lista os schemas do banco de dados */ foreach ($this->oMetadata->getSchemas() as $valueSchema) { $tableNames = $this->oMetadata->getTableNames($valueSchema); $namespaceSchema = 'Orm\\' . $this->toCamelCase($valueSchema) . '\\Entities'; /* Lista as tabelas do banco de dados */ foreach ($tableNames as $tableName) { $multiPk = $primaryKey = $bodyExchangeArray = null; $class = new ClassGenerator(); $class->setNamespaceName($namespaceSchema); $docBlockClass = DocBlockGenerator::fromArray(array('shortDescription' => 'Classe tipo model da tabela ' . $tableName . ' dentro do schema ' . $valueSchema, 'longDescription' => null)); $class->setDocBlock($docBlockClass); $class->setName($this->toCamelCase($tableName)); $class->addProperty('DBSCHEMA', $valueSchema, PropertyGenerator::FLAG_STATIC); $class->addProperty('DBTABLE', $tableName, PropertyGenerator::FLAG_STATIC); foreach ($this->oMetadata->getConstraints($tableName, $valueSchema) as $constraint) { if (!$constraint->hasColumns()) { continue; } if ($constraint->isPrimaryKey()) { $columns = $constraint->getColumns(); if (count($columns) > 1) { $multiPk = true; $primaryKey = implode(', ', $columns); } else { $multiPk = false; $primaryKey = $columns[0]; } $class->addProperty('MULTIPK', $multiPk, PropertyGenerator::FLAG_STATIC); $class->addProperty('PKCOLUMN', $primaryKey, PropertyGenerator::FLAG_STATIC); } } /* Cria os metodos setter/getter e as variáveis das colunas da tabela */ $table = $this->oMetadata->getTable($tableName, $valueSchema); /* Lista as colunas da tabela do banco de dados */ foreach ($table->getColumns() as $column) { $varName = $this->camelCase($column->getName()); $class->addProperty($varName, null, PropertyGenerator::FLAG_PRIVATE); $methodGet = 'get' . $this->toCamelCase($column->getName()); $methodSet = 'set' . $this->toCamelCase($column->getName()); $docBlockSet = DocBlockGenerator::fromArray(array('shortDescription' => 'Setter da coluna ' . $column->getName(), 'longDescription' => null, 'tags' => array(new Tag\ParamTag($varName, $this->prepareSqlTypeDocBlock($column->getDataType()))))); $docBlockGet = DocBlockGenerator::fromArray(array('shortDescription' => 'Getter da coluna ' . $column->getName(), 'longDescription' => null, 'tags' => array(new Tag\ReturnTag(array('datatype' => $this->prepareSqlTypeDocBlock($column->getDataType())))))); $bodyGet = 'return $this->' . $varName . ';'; $bodySet = '$this->' . $varName . ' = $' . $this->camelCase($column->getName()) . ';'; $class->addMethod($methodSet, array($this->camelCase($column->getName())), MethodGenerator::FLAG_PUBLIC, $bodySet, $docBlockSet); $class->addMethod($methodGet, array(), MethodGenerator::FLAG_PUBLIC, $bodyGet, $docBlockGet); $bodyExchangeArray .= '$this->' . $varName . ' = (isset($data["' . $column->getName() . '"])) ? $data["' . $column->getName() . '"] : null;' . "\n\n"; } $docBlockExchangeArray = DocBlockGenerator::fromArray(array('shortDescription' => 'Função para settar todos os objetos por meio de array', 'longDescription' => null, 'tags' => array(new Tag\ParamTag('data', 'array')))); $class->addMethod('exchangeArray', array('data'), MethodGenerator::FLAG_PUBLIC, $bodyExchangeArray, $docBlockExchangeArray); $docBlockGetArrayCopy = DocBlockGenerator::fromArray(array('shortDescription' => 'Função para retornar os valores por meio de array dos objetos da classe', 'longDescription' => null, 'tags' => array(new Tag\ReturnTag(array('datatype' => 'mixed'))))); $class->addMethod('getArrayCopy', array(), MethodGenerator::FLAG_PUBLIC, 'return get_object_vars($this);', $docBlockGetArrayCopy); $classCode = "<?php" . PHP_EOL; $classCode .= $class->generate(); /* $idxConstraint = 0; foreach ($this->oMetadata->getConstraints($tableName, $valueSchema) as $constraint) { $typeConstraint = ($constraint->isPrimaryKey()) ? 'pk' : (($constraint->isForeignKey()) ? 'fk' : null); if (!empty($typeConstraint)) { $consName = $constraint->getName(); $contraintObj = $this->oMetadata->getConstraint($consName, $tableName, $valueSchema); $constraintColumns = $contraintObj->getColumns(); if (count($constraintColumns) > 1) { foreach ($constraintColumns as $valueConsColumns) { $this->aDatabase[$valueSchema][$tableName][$valueConsColumns]['constraints']['type'] = $typeConstraint; if ($typeConstraint === 'fk') { $this->aDatabase[$valueSchema][$tableName][$valueConsColumns]['constraints']['schemaRef'] = $contraintObj->getReferencedTableSchema(); $this->aDatabase[$valueSchema][$tableName][$valueConsColumns]['constraints']['tableRef'] = $contraintObj->getReferencedTableName(); $this->aDatabase[$valueSchema][$tableName][$valueConsColumns]['constraints']['columnsRef'] = $contraintObj->getReferencedColumns(); } } } else { $this->aDatabase[$valueSchema][$tableName][$constraintColumns[0]]['constraints']['type'] = $typeConstraint; if ($typeConstraint === 'fk') { $this->aDatabase[$valueSchema][$tableName][$constraintColumns[0]]['constraints']['schemaRef'] = $contraintObj->getReferencedTableSchema(); $this->aDatabase[$valueSchema][$tableName][$constraintColumns[0]]['constraints']['tableRef'] = $contraintObj->getReferencedTableName(); $this->aDatabase[$valueSchema][$tableName][$constraintColumns[0]]['constraints']['columnsRef'] = $contraintObj->getReferencedColumns(); } } } $idxConstraint++; } * */ file_put_contents($this->ormFolder . $this->toCamelCase($valueSchema) . DS . 'Entities' . DS . $this->toCamelCase($tableName) . '.php', $classCode); chmod($this->ormFolder . $this->toCamelCase($valueSchema) . DS . 'Entities' . DS . $this->toCamelCase($tableName) . '.php', 0644); $this->generatorClassEntityTable($valueSchema, $tableName); } //gera arquivo por tabela } return $this; }
private function writeParamFile() { $file = $this->path . DIRECTORY_SEPARATOR . 'Params.php'; if (file_exists($file) && class_exists($this->namespace . '\\Params')) { $class = new ClassReflection($this->namespace . '\\Params'); $paramsClass = ClassGenerator::fromReflection($class); } else { $paramsClass = new ClassGenerator('Params', $this->namespace, null, 'OpenStack\\Common\\Api\\AbstractParams'); } foreach ($this->operations as $operation) { $params = $operation['params']; if (empty($params)) { continue; } foreach ($params as $paramName => $paramVal) { $name = $paramName . ucfirst($paramVal['location']); if ($paramsClass->hasMethod($name)) { continue; } $body = sprintf("return %s;", $this->arrayEncoder->encode($paramVal, ['array.align' => true])); $body = str_replace("'\$", '$', $body); $body = str_replace("()'", '()', $body); $docblock = new DocBlockGenerator(sprintf("Returns information about %s parameter", $paramName), null, [new ReturnTag(['array'])]); $paramsClass->addMethod($name, [], MethodGenerator::FLAG_PUBLIC, $body, $docblock); } } $output = sprintf("<?php\n\n%s", $paramsClass->generate()); file_put_contents($file, $output); }
/** * {@inheritDoc} */ public function generate(ClassGenerator $classGenerator) { return $classGenerator->generate(); }
/** * Generate mock class * * @return string */ public function generate() { $this->generateTraitMethods(); return parent::generate(); }