AMFPHP:PHPクラスをAS3クラスにマッピングできません
-
02-10-2019 - |
質問
Flash Player 10Xを搭載したAMFPHP 1.9、ActionScript 3、Adobe Flash Pro CS5を使用しています。 AMFPHPセリックスを呼び出すことでデータを取得しようとしていました。 Flash IDE内からアプリを実行しています。
文字列や整数などのプリミティブタイプの場合、それは正常に動作しています。しかし、カスタムオブジェクトを取得しようとすると、次のエラーが表示されます。
SecurityError:エラー#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);
}
}
シーン
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日間の10日後、あなたは答えました:)私はあなたが返事をしたいのであなたの答えを上げました。もう一度ありがとう。
ブラウザからもテストしました。同じ結果。
しかし、私は最終的に、それが数日前に機能していなかった理由を見つけました。問題は、いくつかの奇妙な(またはセキュリティ)理由で、Movieclipから継承するカスタムAS3クラス(およびすべてのシステムクラスについて)をPHPのカウンターパート、私の場合はScene.phpクラスからマッピングできないことです。ただし、AS3クラスをPHPサービスクラスに送信して、マッピングに成功させることができます。この問題に対処するために、アーキテクチャにいくつかの変更をもたらし、問題を解決しなければなりませんでした。しかし、この問題は本当に私を率いて、私はこの投稿を何日も希望して数日間の時間に監視し続けました。
とにかく、フラッシュプレーヤーバージョン10.1.82.76でのみテストしました。以前のバージョンで動作するかどうかはわかりません。テストしなかったためです。
他のヒント
ブラウザ内から実行してみてください。AMFPHP / Flash ActがIDE内で面白いことがわかりました。