Les derniers articles
Créer un service web avec uml2php5
Date :: 2005-02-10
Last Updated :: 2005-02-12
Introduction
uml2php5 est un plugin destiné à se greffer sur
Dia, application de modélisation
UML fonctionnant sous linux et windows,
permettant de générer automatiquement les squelettes des classes PHP
à partir des diagrammes.
Ce plugin est basé sur XSLT.
Depuis la version 2.0, uml2php5 intègre une nouvelle fonctionnalité fort intéressante,
la génération de services web basés sur SOAP
et WSDL.
Le plugin génèrera la totalité des fichiers nécessaires au fonctionnement de votre service web, à savoir, le serveur SOAP,
le fichier WSDL décrivant le service web et le squelette de la (ou des) classe(s) de gestion des requêtes envoyées au service.
Nous allons voir comment s'en servir.
Installation
Installation de Dia
Commençons par installer Dia, le logiciel de création de diagramme UML :
1 - Sous linux:
Il existe différentes manières d'installer ce logiciel, vous pouvez compiler les sources
ou bien utiliser des paquets ( .deb ou rpm ) précompilés, il en existe pour à peu près toutes les distributions majeures.
Personnellement, un simple apt-get install dia m'a suffi.
Chez moi le script a été installé dans /usr/share/dia
2 - sous windows :
Télecharger l'installer et laissez-vous guider, c'est aussi simple que ça.
Installation de uml2php5
1 - linux
Une fois l'archive télechargée, commencez par la décompresser :
tar -zxvf uml2php5-*.tar.gz
2 - windows :
Dézipper l'archive grâce à votre logiciel favori.
Dans un cas comme dans l'autre, les fichiers suivants vont être extraits dans un répertoire :
- * stylesheet.xml
- * dia-uml-classes.zx
- * dia-uml2php5.zx
- * dia-uml2php5.conf.xsl
Copiez tout ces fichiers dans le répertoire xslt de Dia. Comme indiqué dans la documentation officielle de uml2php5, il est conseillé de faire une copie de sauvegarde du fichier stylesheet.xml.
Configurons uml2php5
Nous allons donc configurer uml2php5, et notamment l'addresse de notre serveur SOAP.
Le fichier de configuration à éditer est un fichier XSL nommé dia-uml2php5.conf.xsl.
Recherchez le paramètre <xsl:param name="SOAP_SERVER_URL"/>
et remplacez-le par l'URL que vous désirez obtenir pour votre serveur.
Vous pouvez jeter un oeil aux autres paramètres,
mais leur valeur par défaut nous conviendra très bien pour le moment.
Créons notre diagramme UML
Description de notre service web
Nous allons créer un service web très simple à titre d'exemple. Il comprendra quatre méthodes publiques destinées à additionner, soustraire, multiplier ou diviser deux nombres.
- myWebService :: add( $a , $b ) : Additionne $a et $b;
- myWebService :: sub( $a , $b ) : Soustraie $a et $b;
- myWebService :: mul( $a , $b ) : Multiplie $a et $b;
- myWebService :: div( $a , $b ) : Divise $a par $b.
Le diagramme UML
Voici comment créer le diagramme ci-dessous :
- Dans le menu général de Dia, sélectionnez "nouveau" dans le menu fichier,
une nouvelle fenêtre vierge s'ouvre.
- Toujours dans la fenêtre principale de Dia, selectionnez UML, et cliquez sur "classe".
- Déplacez-vous dans la fenêtre de votre diagramme (encore vide) et cliquez, une boite "classe" apparait.
- Double-cliquez sur cette boite, un menu apparait.
Il va vous permettre de renseigner les méthodes, propriétés, nom, ... de la classe.
- dans le premier onglet nommé "classe", renseignez le nom de la classe, ici myWebService
et le stéréotype SOAP.
- Passez directement dans l'onglet "opérations" pour renseigner les quatre méthodes de la classe.
- Renseignez donc le nom de chaque méthode (add, sub, mul et div), leur visibilité (publique) et le type de retour attendu (float).
- Pour chaque méthode, renseignez également leurs paramètres (a et b) et le type de ces derniers (float).
Voilà, vous pouvez sauvegarder votre diagramme.
Exportons notre diagramme
Pour exporter la totalité de notre service web, il faut procéder en deux étapes.
Tout d'abord, exportons la classe qui gérera les requêtes envoyées à notre service web :
- Dans la fenêtre où se trouve votre diagramme, faites un clic droit > fichier > exporter.
Déterminez le type de fichier : Filtre de transformation XSL (*.code) et validez.
Un boite de dialogue s'ouvre, selectionnez UML-CLASSES-EXTENDED et PHP5.
L'export vous générera le squelette de la classe myWebService.class.php dans le même répertoire que votre fichier Dia.
- De la même manière, exportez votre diagramme en utilisant les paramètres UML-CLASSES-EXTENDED et PHP5/WSDL/SOAP Web Service.
Cet export vous générera le fichier WSDL et le serveur SOAP.
Les fichiers générés
Voici les codes sources des trois fichiers générés par uml2php5.
La classe myWebService
Squelette de la classe qui va gérer les requêtes vers le service web. Il va bien sûr falloir remplir les méthodes.
/**
*
* Code skeleton generated by dia-uml2php5 plugin
* written by KDO kdo@zpmag.com
*/
class myWebService {
/**
* additionne $a et $b
* @access public
* @param float $a
* @param float $b
* @return float
*/
public final function add($a, $b) {
}
/**
* soustraie $a et $b
* @access public
* @param float $a
* @param float $b
* @return float
*/
public final function sub($a, $b) {
}
/**
* multiplie $a et $b
* @access public
* @param float $a
* @param float $b
* @return float
*/
public final function mul($a, $b) {
}
/**
* @access public
* @param float $a
* @param float $b
* @return float
*/
public final function div($a, $b) {
}
}
?>
Le serveur SOAP
Le serveur SOAP, complet, il n'y a rien à retoucher.
/**
* Code generated by dia-uml2php5 plugin
* written by KDO kdo@zpmag.com
*/
if (empty($_GET['action'])) {
die('SOAP server error');
}
// disabling WSDL cache
ini_set('soap.wsdl_cache_enabled', FALSE);
$server = new SoapServer('Webservices.wsdl');
// Selecting SOAP action
switch ($_GET['action']) {
case 'myWebService':
require_once($_GET['action'].'.class.php');
$server->setClass($_GET['action']);
break;
default :
die('SOAP server error');
}
$server->setPersistence(SOAP_PERSISTENCE_SESSION);
$server->handle();
?>
Le fichier WSDL
Le fichier WSDL, complet, il n'y a rien à retoucher si vous avez pris soin de configurer l'URL du serveur SOAP comme indiqué au début de l'article.
<!--
This file has been generated by UML2PHP5
UML2PHP5 is free and released under GPL
Copyright KDO kdo@zpmag.com
UML2PHP5 : uml2php5.zpmag.com
-->
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:webservice" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="WebServices" targetNamespace="urn:webservice">
<message name="addRequest">
<part name="a" type="xsd:float"/>
<part name="b" type="xsd:float"/>
</message>
<message name="addResponse">
<part name="return" type="xsd:float"/>
</message>
<message name="subRequest">
<part name="a" type="xsd:float"/>
<part name="b" type="xsd:float"/>
</message>
<message name="subResponse">
<part name="return" type="xsd:float"/>
</message>
<message name="mulRequest">
<part name="a" type="xsd:float"/>
<part name="b" type="xsd:float"/>
</message>
<message name="mulResponse">
<part name="return" type="xsd:float"/>
</message>
<message name="divRequest">
<part name="a" type="xsd:float"/>
<part name="b" type="xsd:float"/>
</message>
<message name="divResponse">
<part name="return" type="xsd:float"/>
</message>
<portType name="myWebServicePortType">
<operation name="add">
<input message="tns:addRequest"/>
<output message="tns:addResponse"/>
</operation>
<operation name="sub">
<input message="tns:subRequest"/>
<output message="tns:subResponse"/>
</operation>
<operation name="mul">
<input message="tns:mulRequest"/>
<output message="tns:mulResponse"/>
</operation>
<operation name="div">
<input message="tns:divRequest"/>
<output message="tns:divResponse"/>
</operation>
</portType>
<binding name="myWebServiceBinding" type="tns:myWebServicePortType">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="add">
<soap:operation soapAction="urn:myWebServiceAction"/>
<input>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="sub">
<soap:operation soapAction="urn:myWebServiceAction"/>
<input>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="mul">
<soap:operation soapAction="urn:myWebServiceAction"/>
<input>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
<operation name="div">
<soap:operation soapAction="urn:myWebServiceAction"/>
<input>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</input>
<output>
<soap:body use="encoded" namespace="urn:xmethods" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
</output>
</operation>
</binding>
<service name="Webservice">
<port name="myWebServicePort" binding="tns:myWebServiceBinding">
<soap:address location="http://votresite.com/soap_server.php?action=myWebService"/>
</port>
</service>
</definitions>
** http://votresite.com correspond à l'URL que vous avez renseignée dans le fichier de configuration de uml2php5.
Remplissons la classe qui va gérer notre service web
Une fois tous les fichiers générés, il reste la dernière étape pour mettre en place notre service web : compléter les méthodes de la classe qui va gérer les requêtes. Comme vous pouvez le constater, c'est assez simpliste pour l'exemple que nous avons choisi.
/**
*
* Code skeleton generated by dia-uml2php5 plugin
* written by KDO kdo@zpmag.com
*/
class myWebService {
public final function add($a, $b) {
return $a + $b;
}
public final function sub($a, $b) {
return $a - $b;
}
public final function mul($a, $b) {
return $a * $b;
}
public final function div($a, $b) {
if( $b == 0) {
throw new SoapFault('Data Type' , '$b ne peut être égal à 0');
}
return $a / $b;
}
}
?>
Utilisation - Interrogation du service web
L'utilisation est classique et ne nécessite pas de commentaire particulier.
ini_set('soap.wsdl_cache_enabled', 0);
$client = new SoapClient('http://votresite.com/Webservices.wsdl');
echo $client->add(10,1) , '<br/>';
echo $client->sub(10,2) , '<br/>';
echo $client->mul(10.5, 2) , '<br/>';
echo $client->div(10,2) , '<br/>';
?>
Liens utiles
Conclusion
Cette nouvelle fonctionnalité, arrivée avec la version 2.0 de uml2php5 est purement et simplement un régal ! La génération de service web devient d'une facilité déconcertante, notamment grâce à la génération automatique du fichier WSDL decrivant le service web, qui restait quand même la tâche la plus fastidieuse (j'ai dit chiante ? :).
Trackback
Il n'y a pas de trackback recensé pour cet article.
Faire un trackback sur cet article http://classes.scriptsphp.org/Trackbackserver.Creer-un-service-web-avec-uml2php5, récupérer les trackback sur cet article