2010-09-10 4 views
0

J'utilise AMFPHP 1.9, ActionScript 3 et Adobe Flash Pro CS5 avec Flash player 10x. J'essayais d'obtenir des données en appelant des serices amfphp. J'utilise l'application depuis l'IDE Flash.AMFPHP: Impossible de mapper la classe PHP à la classe AS3

Pour les types primitifs tels que string ou integer, cela fonctionne correctement. Mais lorsque vous essayez d'obtenir un objet personnalisé, il affiche l'erreur suivante:

SecurityError: Erreur # 2000: Aucun contexte de sécurité actif.

Et le paramètre dans la fonction de gestionnaire de résultat contient null. Ai-je manqué quelque chose ici? S'il vous plaît aider.

Voici mes classes:

ServiceContext.as

import flash.net.NetConnection; 
import flash.net.ObjectEncoding; 
import flash.events.NetStatusEvent; 

internal class ServiceContext 
{ 
    protected var myService:NetConnection; 

    public function ServiceContext():void 
    { 
     myService = new NetConnection(); 
     myService.objectEncoding = ObjectEncoding.AMF3; 
     myService.connect("http://localhost/MyApp/amfphp/gateway.php"); 
     myService.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus); 
    } 

    private function onNetStatus(event:NetStatusEvent):void 
    { 
     trace(event.info);    
    } 
} 

SceneService.as

import com.ddr.cv.model.Scene; 
import flash.net.Responder;  

public class SceneService extends ServiceContext 
{ 
    public function SceneService():void 
    { 
     com.ddr.cv.model.Scene.register(); 
    } 

    public function getSceneByID(sceneID:uint, resultHandler:Function, faultHandler:Function) 
    { 
     var responder = new Responder(resultHandler, faultHandler); 
     myService.call("com.ddr.cv.model.Scene.getSceneByID", responder, sceneID); 
    } 

    public function saveScene(scene:Scene, resultHandler:Function, faultHandler:Function) 
    { 
     var responder = new Responder(resultHandler, faultHandler); 
     myService.call("Scene.saveScene", responder, scene); 
    } 
} 

Scene.as

import flash.display.MovieClip; 
    import flash.net.registerClassAlias; 

    [RemoteClass(alias="com.ddr.cv.model.Scene")] 
    [Bindable] 
    public class Scene extends MovieClip 
    { 

     private var _id:uint; 
     public function get id():uint 
     { 
      return _id; 
     } 

     private var _sceneName:String; 
     public function get sceneName():String 
     { 
      return _sceneName; 
     } 

     private var _imageName:String; 
     public function get imageName():String 
     { 
      return _imageName; 
     } 

     private var _sceneCategoryID:int; 
     public function get sceneCategoryID():int 
     { 
      return _sceneCategoryID; 
     } 

     private var _userID:String; 
     public function get userID():String 
     { 
      return _userID; 
     } 

     private var _creationDate:Date; 
     public function get creationDate():Date 
     { 
      return _creationDate; 
     } 

     public function Scene(id:uint = 0, sceneName:String = null, imageName:String = null, sceneCategoryID:int = 0, userID:String = null, creationDate:Date = null):void 
     { 
      _id = id; 
      _sceneName = sceneName; 
      _imageName = imageName; 
      _sceneCategoryID = sceneCategoryID; 
      _userID = userID; 
      _creationDate = creationDate; 
     } 

     public static function register():void 
     { 
      registerClassAlias("com.ddr.cv.model.Scene", com.ddr.cv.model.Scene) ; 
     } 
} 

et voici Scene.php

<?php 
class Scene { 

    var $id; 
    var $sceneName; 
    var $imageName; 
    var $sceneCategoryID; 
    var $userID; 
    var $creationDate; 

    // explicit actionscript package 
    var $_explicitType = "com.ddr.cv.model.Scene"; 

    function Scene($id = 0, $sceneName = null, $imageName = null, $sceneCategoryID = 0, $userID = null, $creationDate = null) 
    { 
     $this->id = $id; 
     $this->sceneName = $sceneName; 
     $this->imageName = $imageName; 
     $this->sceneCategoryID = $sceneCategoryID; 
     $this->userID = $userID; 
     $this->creationDate = $creationDate; 
    } 

    function getSceneByID($id){ 
     //creating dummy Scene object 
     $scene = new Scene(1, "Test Scene", "test_scene.jpg", 6, null, null); 
     return $scene; 
    } 

    function saveScene($scene) 
    { 
     //To Do: 
    } 
} 
?> 

Voici comment j'appelle le service:

var sceneService:SceneService = new SceneService(); 
sceneService.getSceneByID(1, getSceneByID_resultHandler, getSceneByID_faultHandler); 

Handlers:

public function getSceneByID_resultHandler(scene:com.ddr.cv.model.Scene):void 
    { 
     //scene contains null here. 
     //Shouldn't it contain the dummy Scene object from amfphp service method? 
     trace("Success: " + scene); 
    } 

    public function getSceneByID_faultHandler(fault:Object):void 
    { 
     trace(">>> fault:" + fault.description); 
    } 

Répondre

2

@daidai: Merci beaucoup pour votre réponse. Je pensais que ce post résiderait toujours profondément dans la base de données SOF sans réponse/non-répondu et ne verrait jamais la lumière. Et puis, après 10 longues journées, vous avez répondu :) J'ai augmenté votre réponse parce que vous aimiez répondre. Encore merci.

Je l'ai également testé à partir du navigateur. Même résultat

Mais j'ai finalement compris pourquoi cela ne fonctionnait pas il y a plusieurs jours. Le problème est que, pour des raisons étranges (ou de sécurité), les classes AS3 personnalisées qui héritent de MovieClip (et je suppose pour toutes les classes système) ne peuvent pas être mappées de leurs homologues PHP, dans mon cas, de la classe Scene.php. Mais la classe AS3 peut être envoyée à la classe de service PHP et être mappée avec succès. J'ai dû apporter quelques modifications à mon architecture pour résoudre ce problème et résoudre mon problème. Mais ce problème m'a vraiment mis en colère et j'ai gardé ce poste sous surveillance horaire pendant des jours dans l'espoir d'une réponse.

Quoi qu'il en soit, je l'ai seulement testé sur la version 10.1.82.76 du lecteur Flash. Je ne sais pas si cela fonctionne dans les versions précédentes car je n'ai pas testé sur eux.

3

Essayez d'exécuter à partir d'un navigateur, j'ai trouvé AMFPHP/Flash agir drôle dans l'IDE.

Questions connexes