/** * Generates the class if not already generated */ public function generateClass() { // Add prefix and suffix $name = $this->config->getPrefix() . $this->identifier . $this->config->getSuffix(); // Generate a valid classname $name = Validator::validateClass($name); // uppercase the name $name = ucfirst($name); // Create the class object $comment = new PhpDocComment($this->description); $this->class = new PhpClass($name, $this->config->getClassExists(), '\\SoapClient', $comment); // Create the constructor $comment = new PhpDocComment(); $comment->addParam(PhpDocElementFactory::getParam('array', 'options', 'A array of config values')); $comment->addParam(PhpDocElementFactory::getParam('string', 'wsdl', 'The wsdl file to use')); $comment->setAccess(PhpDocElementFactory::getPublicAccess()); $source = ' foreach (self::$classmap as $key => $value) { if (!isset($options[\'classmap\'][$key])) { $options[\'classmap\'][$key] = $value; } } ' . $this->generateServiceOptions() . ' parent::__construct($wsdl, $options);' . PHP_EOL; $function = new PhpFunction('public', '__construct', 'array $options = array(), $wsdl = \'' . $this->config->getInputFile() . '\'', $source, $comment); // Add the constructor $this->class->addFunction($function); // Generate the classmap $name = 'classmap'; $comment = new PhpDocComment(); $comment->setAccess(PhpDocElementFactory::getPrivateAccess()); $comment->setVar(PhpDocElementFactory::getVar('array', $name, 'The defined classes')); $init = 'array(' . PHP_EOL; foreach ($this->types as $type) { if ($type instanceof ComplexType) { $init .= " '" . $type->getIdentifier() . "' => '" . $this->config->getNamespaceName() . "\\" . $type->getPhpIdentifier() . "'," . PHP_EOL; } } $init = substr($init, 0, strrpos($init, ',')); $init .= ')'; $var = new PhpVariable('private static', $name, $init, $comment); // Add the classmap variable $this->class->addVariable($var); // Add all methods foreach ($this->operations as $operation) { $name = Validator::validateOperation($operation->getName()); $comment = new PhpDocComment($operation->getDescription()); $comment->setAccess(PhpDocElementFactory::getPublicAccess()); $comment->setReturn(PhpDocElementFactory::getReturn($operation->getReturns(), '')); foreach ($operation->getParams() as $param => $hint) { $arr = $operation->getPhpDocParams($param, $this->types); $comment->addParam(PhpDocElementFactory::getParam($arr['type'], $arr['name'], $arr['desc'])); } $source = ' return $this->__soapCall(\'' . $operation->getName() . '\', array(' . $operation->getParamStringNoTypeHints() . '));' . PHP_EOL; $paramStr = $operation->getParamString($this->types); $function = new PhpFunction('public', $name, $paramStr, $source, $comment); if ($this->class->functionExists($function->getIdentifier()) == false) { $this->class->addFunction($function); } } }
/** * Implements the loading of the class object * * @throws Exception if the class is already generated(not null) */ protected function generateClass() { if ($this->class != null) { throw new Exception("The class has already been generated"); } $class = new PhpClass($this->phpIdentifier, $this->config->getClassExists(), $this->baseType !== null ? $this->baseType->getPhpIdentifier() : ''); // Add the base class as a dependency. Otherwise we risk referencing an undefined class. if (!empty($this->baseType) && !$this->config->getOneFile() && !$this->config->getNoIncludes()) { $class->addDependency($this->baseType->getIdentifier() . '.php'); } $constructorComment = new PhpDocComment(); $constructorComment->setAccess(PhpDocElementFactory::getPublicAccess()); $constructorSource = ''; $constructorParameters = ''; $accessors = array(); // Add base type members to constructor parameter list first and call base class constructor if ($this->baseType !== null) { foreach ($this->baseType->getMembers() as $member) { $type = Validator::validateType($member->getType()); $name = Validator::validateAttribute($member->getName()); if (!$member->getNillable()) { $constructorComment->addParam(PhpDocElementFactory::getParam($type, $name, '')); $constructorComment->setAccess(PhpDocElementFactory::getPublicAccess()); $constructorParameters .= ', $' . $name; } } $constructorSource .= ' parent::__construct(' . substr($constructorParameters, 2) . ');' . PHP_EOL; } // Add member variables foreach ($this->members as $member) { $type = Validator::validateType($member->getType()); $name = Validator::validateAttribute($member->getName()); $comment = new PhpDocComment(); $comment->setVar(PhpDocElementFactory::getVar($type, $name, '')); $comment->setAccess(PhpDocElementFactory::getPublicAccess()); $var = new PhpVariable('public', $name, 'null', $comment); $class->addVariable($var); if (!$member->getNillable()) { $constructorSource .= ' $this->' . $name . ' = $' . $name . ';' . PHP_EOL; $constructorComment->addParam(PhpDocElementFactory::getParam($type, $name, '')); $constructorComment->setAccess(PhpDocElementFactory::getPublicAccess()); $constructorParameters .= ', $' . $name; if ($this->config->getConstructorParamsDefaultToNull()) { $constructorParameters .= ' = null'; } if ($this->config->getCreateAccessors()) { $getterComment = new PhpDocComment(); $getterComment->setReturn(PhpDocElementFactory::getReturn($type, '')); $getter = new PhpFunction('public', 'get' . ucfirst($name), '', ' return $this->' . $name . ';' . PHP_EOL, $getterComment); $accessors[] = $getter; $setterComment = new PhpDocComment(); $setterComment->addParam(PhpDocElementFactory::getParam($type, $name, '')); $setter = new PhpFunction('public', 'set' . ucfirst($name), '$' . $name, ' $this->' . $name . ' = $' . $name . ';' . PHP_EOL, $setterComment); $accessors[] = $setter; } } } $constructorParameters = substr($constructorParameters, 2); // Remove first comma $function = new PhpFunction('public', '__construct', $constructorParameters, $constructorSource, $constructorComment); // Only add the constructor if type constructor is selected if ($this->config->getNoTypeConstructor() == false) { $class->addFunction($function); } foreach ($accessors as $accessor) { $class->addFunction($accessor); } $this->class = $class; }