AMFPHP: невозможно сопоставить класс PHP с классом AS3 - PullRequest
0 голосов
/ 11 сентября 2010

Я использую AMFPHP 1.9, ActionScript 3 и Adobe Flash Pro CS5 с Flash Player 10x.Я пытался получить данные, вызывая amfphp serices.Я запускаю приложение из 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);
    }

Ответы [ 2 ]

3 голосов
/ 20 сентября 2010

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

2 голосов
/ 23 сентября 2010

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

Я тоже проверял это из браузера.Тот же результат.

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

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

...