Flash Remoting – introduction à AMFPHP
Le dossier AMFPHP
Dans ce dossier, deux éléments nous intéressent 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 connections.
Pour l’instant, nous n’avons pas utilité des autres fichiers et dossiers.
Les divers dossiers et fichiers :
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, parlent d’eux-mêmes rien que par leurs noms.
Le fichier gateway.php
Le fichier est suffisamment commenté pour que vous puissiez l’explorer par vous-même. Les deux points essentiels à 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 caractè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 une à une les différentes étapes.
Création du service
Un service correspond à une classe PHP qui offre une série de fonctionnalités côté 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.
Commençons donc par créer une classe PHP et enregistrons-la dans le dossier service de AMFPHP. Sans ouvrir un tutoriel POO sur PHP, rappelons qu’une classe doit comporter un nom de fichier, un nom de classe et un nom de fonction constructeur identiques, et sensibles à la casse.
Par convention, les noms de classe utilisent des hauts de casse pour chaque première lettre de chaque mot, comme PremierClasse par exemple… donc créons 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 du moins de se faciliter le travail.
La description doit porter sur des paramètres d’accès, private ou remote, de description, une chaîne de caractères et d’arguments, un tableau. Voyons par l’exemple. Notre classe va pour l’instant contenir une seule 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 côté 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 réparties 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 souci vient du fait que ce genre d’échange se fait de manière asynchrone. C’est-à-dire qu’entre l’instant où Flash appelle le service et le moment 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. 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 info 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ébogueur 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 processus d’échange entre Flash Player et la passerelle AMFPHP.
Vous pouvez donc constater que la connection s’établit correctement, puis l’appel à la fonction appel(), et enfin l’explication sur la source de l’erreur, qui provient en fait d’un souci d’exécution côté AMFPHP. La passerelle attend un paramètre pour la fonction et celui-ci n’est pas fournit. Ajoutez-le à votre code, testez à nouveau et la fenêtre de sortie affichera « ——–« .
Trace côté 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 côté PHP. La syntaxe d’appel de la fonction trace(), sur le NetConnection Debugger depuis PHP, est :
NetDebug::trace("coucou ici le debogueur")