Oui, vous avez bien lu. Nous allons pouvoir travailler avec des objets de notre cru, aussi bien du côté php que du côté flex.

Pour l'exemple, nous allons travailler avec un objet très simple. Il s'agit d'un objet 'User' qui contient 3 propriétés. Nous allons devoir créer 2 versions de cet objet : une côté php, une autre côté flex. Ecrivons d'abord ces objets :

Coté Flex, User.as :

package com.phiphou.application
{
	[Bindable]
	public dynamic class User
	{
		public var login:String;
		public var pswd:String;
		public var logged:Boolean;
		
		public function User()
		{
		}
	}
}

Comme le chemin de cette classe nous l'indique, ce fichier devra se trouver dans le dossier phiphou/com/phiphou/application/

Coté PHP, User.php :

<?php
 
class User {
 
	var $login;
	var $pswd;
	var $logged;
 
	function User()
	{
	}
}
?>

Attention, cet objet devra se trouver dans un dossier phiphou/amfphp/services/vo/com/phiphou/application/

Ecrivons maintenant côté Flex l'appel à notre service :

 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
	layout="absolute" >
	
<mx:RemoteObject id="services" destination="amfphp" source="ServiceClass">
    <mx:method name="sendUserObjectToPHP" 
               result="sendUserObjectToPHP_resultHandler(event)"
               fault="faultHandler(event)"/>
</mx:RemoteObject>
 
<mx:Script>
<![CDATA[
 
	import com.phiphou.application.User;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
 	import mx.controls.Alert;		
	
	/**
	* handleFault
	* Si erreur, on l'affiche
	*/
	private function faultHandler(fault:FaultEvent):void
        {
		Alert.show(fault.fault.faultString, fault.fault.faultCode.toString());	
       }
	
	/**
	* sendUserObjectToPHP
	* Appel de la methode sendUserObjectToPHP de notre classe PHP
	*/
		
	public function sendUserObjectToPHP() :void
	{
		var u:User = new User();
		u.login = "bob";
		u.pswd = "007"
		
		services.getOperation('sendUserObjectToPHP').send(u);
	}
		
	/**
	* sendToPHP_resultHandler
	* Résultat pour sendToPHP 
	*/
	private function sendUserObjectToPHP_resultHandler(evt:ResultEvent) :void
	{
		infos.text = evt.result.toString();	
	}
 
	]]>
</mx:Script>
	
	<mx:TextArea x="10" y="10" id="infos" height="72"/>
	<mx:Button x="10" y="90" label="Appel du service" click="sendUserObjectToPHP()"/>
	
</mx:Application>

Ce service crée côté Flex un objet de type User et l'envoie à php. Php nous renverra true si l'objet qu'il reçoit est bien reconnu par php comme objet de type User.

Testons :

Nous obtenons "False". Apparemment, php ne reconnait pas l'objet reçu comme étant de type User. Il y une raison à cela. En effet, nous devons spécifier dans les objets leur type respectif, comme ceci :

Côté PHP :

<?php
//Objet User "mappé" avec l'objet 'User' de Flex
class User {
 
	//on indique le type d'objet
	var $_explicitType = "com.phiphou.application.User";
	var $login;
	var $pswd;
	var $logged;
 
	function User()
	{
	}
}
?>

Côté Flex :

package com.phiphou.application
{
	//Notre objet User "mappé" avec son équivalent php
	[RemoteClass(alias="com.phiphou.application.User")]
 
	[Bindable]
	public dynamic class User
	{
		public var login:String;
		public var pswd:String;
		public var logged:Boolean;
		
		public function User()
		{
		}
	}
}

Testons à nouveau notre application :

Nous obtenons alors "true", ce qui signifie que php reconnait bien l'objet envoyé par Flex comme étant de type User.

Voyons maintenant si cela fonctionne dans l'autre sens. Nous allons partir du code existant, et le modifier afin que php modifie une des propriétés de l'objet reçu puis renvoie à Flex cet objet modifié. Flex devra alors reconnaitre cet objet envoyé par php comme étant de type User et pourra lire la propriété de l'objet modifiée par php.

Modifions donc notre service côté php :

function sendUserObjectToPHP($u)
        {
        $u->logged = true;
	return $u;
	}

Et côté Flex, nous modifions notre fonction de retour comme ceci:

private function sendUserObjectToPHP_resultHandler(evt:ResultEvent) :void
{
	var u:User = evt.result as User;
	infos.text = u.logged.toString();
}

Testons à nouveau notre application :

Nous obtenons alors "true", ce qui signifie que php a modifié la propriété "logged" de l'objet User à true (initialement false). Flex a reconnu cet objet comme étant de type User et a pu lire la propriété de l'objet modifiée par php.

Nous pouvons donc partager entre Flex et PHP des classes persos : c'est ce qu'on appelle du ClassMapping.

Attention : Dans les classes pour les VO, les propriétés $_explicitType et [RemoteClass(alias=... doivent correspondre aux chemins vers lesdites classes, côté Flex et côté PHP.

Dans la TROISIÈME ET DERNIÈRE PARTIE de ce tutorial, nous allons voir deux autres types de données que l'on peut manipuler, et voir comment utiliser amfphp en production.