188 lines
5.1 KiB
PHP
188 lines
5.1 KiB
PHP
|
<?php
|
||
|
class Scores_Ws_Doc
|
||
|
{
|
||
|
private $serviceClass;
|
||
|
|
||
|
private $classmap = array();
|
||
|
|
||
|
private $serviceMethods = array();
|
||
|
|
||
|
private $serviceTypes = array();
|
||
|
|
||
|
public function __construct($serviceClass = null, $classmap = null, $path)
|
||
|
{
|
||
|
$this->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<count($resMatches)) {
|
||
|
$comment.= ', ';
|
||
|
}
|
||
|
}
|
||
|
$comment.= ')';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Traitement des références
|
||
|
* @ref fichier:titre:nom_du_fichier
|
||
|
* => 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.= '<a href="'.$urlFichier.'">'.$ref[2].'</a>';
|
||
|
break;
|
||
|
case 'mysql':
|
||
|
$urlMysql = $view->url(array(
|
||
|
'controller' => 'ref',
|
||
|
'action' => 'table',
|
||
|
'q' => $ref[3],
|
||
|
), null, true);
|
||
|
$comment.= '<a href="'.$urlMysql.'">'.$ref[2].'</a>';
|
||
|
break;
|
||
|
}
|
||
|
$comment.= ', ';
|
||
|
}
|
||
|
}
|
||
|
$paramElement = array(
|
||
|
'name' => $name,
|
||
|
'type' => $type,
|
||
|
'description' => trim($comment)
|
||
|
);
|
||
|
|
||
|
}
|
||
|
$paramsElement[] = $paramElement;
|
||
|
}
|
||
|
$typesElement[$className] = $paramsElement;
|
||
|
}
|
||
|
$this->serviceTypes = $typesElement;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|