2010-09-10 3 views
0

Я использую AMFPHP 1.9, ActionScript 3 и Adobe Flash Pro CS5 с Flash Player 10x. Я пытался получить данные, вызывая amfphp serices. Я запускаю приложение из Flash IDE.AMFPHP: не удается сопоставить класс PHP с классом AS3

Для примитивных типов, таких как string или integer, он работает нормально. Но при попытке получить пользовательский объект появляется следующая ошибка:

SecurityError: Error # 2000: Отсутствует активный контекст безопасности.

И параметр в функции обработчика результатов содержит null. Я что-то пропустил? Пожалуйста помоги.

Ниже приведены мои классы:

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) ; 
     } 
} 

и вот 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: 
    } 
} 
?> 

Вот как я называю обслуживание:

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

Хендлеры:

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); 
    } 

ответ

2

@daidai: Большое спасибо, что вы ответили. Я думал, что этот пост будет находиться вечно глубоко внутри базы данных SOF без ответа/без ответа и никогда не увидит свет. И затем, после 10 долгих дней, вы ответили :) Я поднял ваш ответ, потому что вам было интересно ответить. Еще раз спасибо.

Я тестировал его и в браузере. Тот же результат.

Но я, наконец, понял, почему он не работал несколько дней назад. Проблема заключается в том, что по какой-то странной (или по безопасности) причине пользовательские классы AS3, которые наследуются от MovieClip (и, я думаю, для всех системных классов), не могут быть сопоставлены со своими PHP-коллегами, в моем случае, из класса Scene.php. Но класс AS3 можно отправить в класс службы PHP и успешно отобразить. Мне пришлось внести некоторые изменения в мою архитектуру, чтобы решить эту проблему и решить мою проблему. Но эта проблема действительно поставила меня в ярость, и я держал этот пост под часовым наблюдением в течение нескольких дней в надежде на какой-то ответ.

В любом случае, я тестировал его только на версии Flash Player 10.1.82.76. Я не знаю, работает ли он в предыдущих версиях, поскольку я не тестировал их.

3

Попробуйте запустить из браузера, я обнаружил, что AMFHP/Flash смешно в среде IDE.