Le dossier AMFPHP
Dans ce dossier, deux éléments nous intéresse pour commencer à utiliser la passerelle. Le dossier services dans lequel nous devons créer et placer nos services PHP et le fichier gateway.php qui sert de passerelle de connection. Pour l'instant nous n'avons pas utilité des autres fichiers ni des autres dossiers. Pour informations, le dossier amf-core contient l'ensemble des classes nécessaires au bon fonctionnement de Flash Remoting et ne devrait pas être modifié sans un réel besoin de patch ou d'adaptation spécifique. Le dossier browser contient l'ensemble des fichiers nécessaires au service browser que nous utiliserons un peu plus tard. Le reste des fichiers PHP présents à la racine parle de eux mêmes rien que par leur nommage.

Le fichier gateway.php
Le fichier est suffisament commenté pour que vous puissiez l'explorer par vous même. Les deux points essentiel à prendre en compte dés le départ, sont :
- Le mode de gestion d'encodage des caractères qui se trouve entre les lignes 35 et 65 de la page, et placer la bonne définition, vers la ligne 120. A ce sujet il se peut que la ligne adéquate pour les acarctères accentués français ne soit pas décommentée (ligne 121).
- Le bon adressage du core paquetage d'AMFPHP dans l'include ligne 103 dans le cas où vous modifiez son emplacement.
- Le bon adressage du dossier des services, ligne 113, dans le cas où vous renommiez ou déplacez celui ci.
Premier service
Bon assez configuré.... passons à la mise en place de notre premier service. Nous allons approcher une méthode par la racine, nous verrons par la suite que nous pouvons gagner du temps et de la souplesse en utilisant le service browser... pour l'instant partons d'une page blanche et construisons un à un les différentes étapes.
Création du service
Un service correspond à une classe PHP qui offre une série de fonctionnalités coté serveur, qu'il s'agisse de connecter une base de données, un système d'informations, ou tout autre application qui manipule ou gère des données.
Commencons donc par créer une classe PHP et enregistrons là dans le dossier service de AMFPHP. Sans ouvrir un tutorial POO sur PHP, rappelons qu'une classe doit comporter un nom de fichier, un nom de classe et un nom de fonction constructeur identique, et sensible à la casse. Par convention les nom de classe utilise des haut de casse pour chaque premiere lettre de chaque mot, comme PremierClasse par exemple... donc créeons une classe PremiereClasse et enregistrons le fichier PremiereClasse.php.
<?php
class PremiereClasse {
function PremierClasse(){
}
}
?>
La fonction constructeur doit contenir une propriété methodTable qui décrit l'ensemble des fonctions de la classe. Sans cela AMFPHP ne fonctionnera pas et nous obtiendrons une erreur d'interprétation. Dans la version 1.9 d'AMFPHP ceci n'est plus nécessaire, mais nous verrons plus tard une manière de se passer de cette description, ou enfin du moins de se faciliter le travail. La description doit porter sur des paramètres d'accès, private ou remote, de description, une chaine de caractères et d'arguments, un tableau. Voyons par l'exemple. Notre classe va pour l'instant ne contenir qu'une méthode, appel,qui renvoie simplement l'argument que nous lui passons, voici la fonction et sa description via la fonction constructeur :
<?php
class PremiereClasse {
function PremiereClasse(){
$this->methodTable = array(
"appel" => array(
"description" => "Renvoi l'argument envoyé",
"arguments" => array("arg"),
"access" => "remote"
)
);
}
function appel($arg){
return $arg;
}
}
?>
Si vous appelez cette classe depuis le serveur local, si tout fonctionne bien, rien ne doit se passer... c'est à dire aucune erreur de parsing. Vous obtenez une bien belle page blanche.... mais se passe t il réellement quelque chose ? allons voir du coté de Flash.
Appel depuis Flash (fr_01.fla)
Créez un nouveau fichier Flash AS2.0 et bien que cela ne soit pas nécessaire pour le bon fonctionnement de Flash Remoting, enregistrez le dans un dossier sources_fla placé à la racine de votre web local. Avant toute chose, il faut placer les deux composants Flash dans l'animation. Rien de plus simple, ouvrez la bibliothèque partagée, Fenêtre > Bibliothèques communes > Remoting et glissez déposez les deux composants qu'elle contient sur la scène, RemotingClasses et RemotingDebugClasses. Placez les où vous le souhaitez... ils ne sont pas visuels.
Ouvrons ensuite la fenêtre d'Action d'image, et bien que cela semble redondant, importons explicitement le paquetage de classe nécessaire. Rappelez vous que l'ensemble des classes disponibles dans Flash sont situées dans le dossier de l'application puis dans \fr\First Run\Classes\ et reparties dans les dossiers mx, FP7, FP8 et FP9 en fonction de la version au moment de leur apparition.
import mx.remoting.*;
Il faut ensuite invoquer un service, trois paramètres sont nécessaires l'adresse de la passerelle, un second paramètre initialisé sur null pour l'instant qui définirait une classe de suivi, et enfin le troisième correspondant à la classe invoquée par le service.
var service = new Service("http://127.0.0.1/fr/amfphp_12/gateway.php", null, "PremiereClasse");
Le service établi, il suffit alors d'utiliser la méthode appel sur ce service. Le soucis vient du fait que ce genre d'échange se fait de manière asynchrone. C'est à dire qu'entre l'instant où Flash appele le service et le momment où le service renvoit des données il se passe un temps qui n'est pas définissable et qu'on ne peut anticiper. Nous verrons par la suite l'utilisation d'une classe spécialement prévue pour ce genre de traitement la classe PendingCall, mais pour l'instant utilisons directement un évènementiel onResult propre à la classe Service, moins complet mais suffisant pour ce que nous souhaitons observer :
var pc = service.appel();
pc.onResult = function() {
trace("--------")
};
Le NetConnection Debugger (fr_02.fla)
Si vous testez votre animation rien ne se passe ! ni une action de trace, ni un message d'erreur.... Bref, aucune infos pour savoir si cela fonctionne ou pas. Afin de clarifier tout cela utilisons le NetDebuger. Première étape ajout des classes nécessaires, puis et c'est là souvent une cause d'erreur, instancions ce débuggeur. Ajoutez les lignes de code suivantes juste avant d'invoquer le service, ouvrez le débuggeur Fenêtre > Autres panneaux > NetConnection Debuggeur et lancez votre animation.
import mx.remoting.debug.NetDebug; NetDebug.initialize();

Cette fois ci vous pouvez suivre l'ensemble du procesus d'échange entre Flash Player et la passerelle AMFPHP. Donc on peut constater que la connection s'étalie correctement, puis l'appel à la fonction appel(), et enfin l'explication sur la source de l'erreur qui provient en fait d'un soucis d'éxécution coté AMFPHP. La asserelle attend un paramètre pour la fonction et celui n'est pas fournis. Ajoutez le à votre code, testez à nouveau et la fenêtre de sortie affichera "--------".
Trace coté serveur
Le NetConnection Debuggeur permet également de tracer des informations qui proviennent des services. De ce fait il est plus facile de suivre le déroulement du programme et d'avoir l'équivalent d'une fenêtre de sortie coté PHP. La syntaxe d'appel de la fonction trace() sur le NetConnection Debugger depuis PHP est :
NetDebug::trace("coucou ici le debogueur")





