[FLEX] Faire du remoting avec AMFPHP et RemoteObject
21 février 2008 – 12:34La dernière version d'amfphp prend en charge le format AMF3 utilisé par Flex. Si vous débarquez, amfphp permet de transférer des objets complexes de flash/flex vers php et ça le classe au rang des indispensables outils pour mener à bien un projet. Cependant mettre amfphp en place avec Flex peu s'avérer compliquer si on jamais fait ça auparavant. Cet article, qui me sert à la fois d'aide mémoire, présente une méthode pour gérer vos transferts de données entre Flex et PHP avec la classe RemoteObject.
Pour l'exemple, je suppose que vous avez un amfphp installé sur votre machine : http://localhost/amfphp/gateway.php
Taper l'url dans votre navigateur, si vous avez le message ci-dessous c'est que tout est OK.
amfphp and this gateway are installed correctly. You may now connect to this gateway from Flash.
Ensuite il faut spécifier au compilateur de Flex qu'il doit utiliser AMFPHP. Ce qui se traduit par ajouter un fichier "services-config.xml" dans les propriétés du projet :
project>properties>Flex Compiler dans le champ "additional compiler arguments" vous ajoutez le chemin vers votre fichier
-services "services-config.xml"
Fichier "services-config.xml" :
<?xml version="1.0" encoding="UTF-8"?> <services-config> <services> <service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage"> <destination id="amfphp"> <channels> <channel ref="my-amfphp"/> </channels> <properties> <source>*</source> </properties> </destination> </service> </services> <channels> <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel"> <endpoint uri="http://localhost/amfphp/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/> </channel-definition> </channels> </services-config>
Attention que lorsque vous créez un projet Flex, par défaut le compilateur regarde dans le dossier "src". Donc si vous mettez votre fichier services-config.xml ailleurs que dans ce dossier, il faut le spécifier.
Dans l'exemple ci-dessous, l'application Flex contient un bouton qui appelle une méthode php. Cette dernière renvoit une valeur qui est affiché dans l'application.
MXML "Main.mxml" :
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:ns1="component.*"> <mx:RemoteObject id="remoting" showBusyCursor="true" source="HelloWorld" destination="amfphp"> <mx:method name="phpMethod" result="handlerResult(event);" /> </mx:RemoteObject> <mx:Script> <![CDATA[ import mx.rpc.events.ResultEvent; private function handlerResult(e:ResultEvent):void { lbl.text = e.result.toString(); } ]]> </mx:Script> <mx:Button x="10" y="10" label="Button" click="remoting.getOperation('phpMethod').send('with parameter');"/> <mx:Label x="10" y="40" text="" id="lbl"/> </mx:Application>
D'abord on déclare le RemoteObject avec l'id, la source qui est le nom de mon service php et la destination qui permet de faire le lien avec le fichier services-config.xml
A l'intérieur je déclare ma méthode "phpMethod" et lui attribue une méthode à exécuté lorsque je reçois un résultat du service. Mon résultat est passé en argument à ma méthode "handlerResult(e:ResultEvent)" et je peux récupérer son contenu pour l'afficher.
Vous ne voulez pas passer de paramètre il suffit d'appeler la méthode comme ceci :
"remoting.getOperation('phpMethod').send();"
Service PHP "HelloWorld.php" :
<?PHP class HelloWorld{ function phpMethod($arg){ return "Hello World from PHP ".$arg; } } ?>
Le script PHP reçoit simplement ma string qu'il concatène et renvoie à Flex. Ce qui donne : "Hello World from PHP with parameter"
Voilà c'est la façon la plus basique de faire du remoting en Flex. Il y a aussi le "class mapping" qui est encore plus puissant et pratique.
2 Responses to “[FLEX] Faire du remoting avec AMFPHP et RemoteObject”
Est-il envisageable d’utiliser cette méthode pour interagir entre PHP, et une application AIR développée sous Flash CS3 (pas Flex) ?
By Alan on sept 16, 2008
Non, tu ne pourras pas utiliser l’exemple ci-dessus comme ça. Flex utilise le protocole AMF 3, Flash CS3 utilise AMF 0
Pas non plus besoin de spécifier un fichier services. Et puis dans Flash CS3 tu n’as pas les mêmes classes que dans Flex…
Donc oui tu peux utiliser AMFPHP, mais pas de la façon dont je décris le processus ici. De même AMFPHP a besoin d’un serveur apache et php pour tourner, donc ton application AIR devra se connecter online.
S.
By Sakana on sept 17, 2008