AMFPHP: не удается сопоставить класс PHP с классом AS3

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

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

SecurityError: ошибка № 2000: нет активного контекста безопасности.

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

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

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

person Kayes    schedule 10.09.2010    source источник


Ответы (2)


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

person daihovey    schedule 20.09.2010

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

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

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

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

person Kayes    schedule 23.09.2010