serviceClass = $serviceClass; $this->classmap = $classmap; require_once $path . 'Service.php'; $this->parseService(); $this->parseTypes(); } /** * Retourne la liste des services et leurs paramètres * @return array */ public function getServiceMethods() { return $this->serviceMethods; } /** * Retourne la liste des types de données et leurs paramètres * @return array */ public function getServiceTypes() { return $this->serviceTypes; } private function parseService() { $class = new Zend_Server_Reflection(); $methods = $class->reflectClass($this->serviceClass) ->getMethods(); $methodsElement = array(); foreach ($methods as $method) { $prototype = null; $maxNumArgumentsOfPrototype = -1; foreach ($method->getPrototypes() as $tmpPrototype) { $numParams = count($tmpPrototype->getParameters()); if ($numParams > $maxNumArgumentsOfPrototype) { $maxNumArgumentsOfPrototype = $numParams; $prototype = $tmpPrototype; } } $paramsElement = array(); foreach ($prototype->getParameters() as $param) { $paramElement = array( 'type' => $param->getType(), 'name' => $param->getName(), 'description' => $param->getDescription(), ); if ($param->isOptional()){ $paramElement['optional'] = $param->isOptional(); $paramElement['defaultValue'] = $param->getDefaultValue(); } $paramsElement[] = $paramElement; } $methodElement = array( 'name' => $method->getName(), 'desc' => $method->getDescription(), 'params' => $paramsElement, 'return' => $prototype->getReturnType(), ); $methodsElement[] = $methodElement; } $this->serviceMethods = $methodsElement; } private function parseTypes() { $typesElement = array(); if (count($this->classmap)>0) { foreach ($this->classmap as $className) { $class = new ReflectionClass($className); $paramsElement = array(); foreach ($class->getProperties() as $property) { if ($property->isPublic() && preg_match_all('/@var\s+([^\s]+)/m', $property->getDocComment(), $matches)) { $name = $property->getName(); $type = $matches[1][0]; /** * Traitement éléments de documentation à placer dans le WSDL * Supprime les retours chariots. * Récupére les éléments de documentation */ $comment = ''; $docBlock = preg_replace('/\n/', '', $property->getDocComment() ); if (preg_match('/\/\*\*(.+) \* @var\s+[^\s]+\s+(?:\*|@)/m', $docBlock, $docBlockMatches)) { $comment.= preg_replace( array('/\r/', '/\*/' ), array('' , ''), $docBlockMatches[1] ); } /** * Traitement des @xsd (Provisoire) * Définition des longueurs dans la documentation * @xsd minLength=[\d]+ => (Longueur min = [\d]+) * @xsd maxLength=[\d]+ => (Longueur max = [\d]+) * @xsd enumeration=element,element */ if (preg_match_all('/@xsd\s+(minLength|maxLength)=([\d]+)\s+(?:\*|@)/m', $property->getDocComment(), $resMatches, PREG_SET_ORDER)){ $comment.= '('; $parcourCpt = 0; foreach ($resMatches as $res ) { switch ($res[1]){ case 'minLength': $comment.= 'Longueur min = '.$res[2]; break; case 'maxLength': $comment.= 'Longueur max = '.$res[2]; break; } $parcourCpt++; if ($parcourCpt>0 && $parcourCpt http://vhost/ref/fichier/ * @ref mysql:titre:requete.sql * => http://vhost/ref/table/ */ if (preg_match_all('/@ref\s+(fichier|mysql):(.*):(.*)\.(?:csv|sql)\s+(?:\*|@)/m', $property->getDocComment(), $refMatches, PREG_SET_ORDER)){ $view = new Zend_View(); $comment.= ', Référence(s) : '; foreach ($refMatches as $ref){ switch ($ref[1]){ case 'fichier': $urlFichier = $view->url(array( 'controller' => 'ref', 'action' => 'fichier', 'q' => $ref[3], ), null, true); $comment.= ''.$ref[2].''; break; case 'mysql': $urlMysql = $view->url(array( 'controller' => 'ref', 'action' => 'table', 'q' => $ref[3], ), null, true); $comment.= ''.$ref[2].''; break; } $comment.= ', '; } } $paramElement = array( 'name' => $name, 'type' => $type, 'description' => trim($comment) ); } $paramsElement[] = $paramElement; } $typesElement[$className] = $paramsElement; } $this->serviceTypes = $typesElement; } } }