1

昨日、この質問に従って、Zend_AMFを使用してPHPアプリケーションからflexフロントエンドに型付きオブジェクトを送信することに成功しました。

私が今直面している問題は、型付きオブジェクトをフレックスからPHPに送信し、PHP側では、ではなく型付きオブジェクトとして受信できるようにすることですstdClass

これがflexのクラスです:

package com.mysite
{
    [Bindable]
    [RemoteClass(alias="CTest")]
    public class CTest
    {

        public var stuff1:String;

        public var stuff2:String;

        public function CTest()
        {
        }
    }
}

そしてこれはPHPの対応するクラスです:

<?php
namespace modules\testing;

class CTest{

    var $_explicitType = 'CTest';

    var $stuff1;

    var $stuff2;
}

フレックスでは、次のようにオブジェクトを送信しています。

var remoteObject:RemoteObject = new RemoteObject(); 
remoteObject.endpoint = "http://localhost/to/my/amf/endpoint"; 
remoteObject.showBusyCursor = true; 
remoteObject.source = 'testing'; 
var op:AbstractOperation = remoteObject.getOperation(null); 
op.addEventListener(ResultEvent.RESULT, result); 
op.send( new CTest()); 

PHP側では、オブジェクトは。という変数に取得されます$parameters。次に、print_rを使用して、結果をファイルに書き込みます。

$z = print_r($parameters, true);
$s = fopen('D:\test.txt', 'w+');
fwrite($s, $z);
fclose($s);

ご覧のとおり、結果は型指定なしで返され、stdClassオブジェクトになります:]

Array
(
    [0] => stdClass Object
        (
            [stuff1] => 
            [stuff2] => 
        )

)

いくつかのテストの後、PHPオブジェクトから名前空間を削除し、グローバル名前空間に移動しました。これで問題は解決したようです。とに設定RemoteClass\modules\testing\CTestてみましmodules.testing.CTestた。$_eplicitType次に、両方のテストで同じ値に設定されました。

その結果、を使用するmodules.testing.CTestと、これがZend_AMFに表示されるクラス名になります。modulestestingCTest名前空間表記を使用すると、すべてのスラッシュが削除されるため、Zend_AMFはを認識します。

しかし、どうすればこれをphp名前空間で機能させることができますか?

4

1 に答える 1

2

最終的に問題を解決しました。これは、将来同じ問題に遭遇する可能性のある人のための解決策です。

PHPクラスの場合:

<?php
namespace app\testing;
class CTest{

    var $_explicitType = 'app\testing\CTest';

    var $stuff1;

    var $stuff2;
}

actionscriptクラスの場合:

package com.mysite
{
    [Bindable]
    [RemoteClass(alias="app\\\\testing\\\\CTest")]
    public class CTest
    {

        public var stuff1:String;

        public var stuff2:String;

        public function CTest()
        {
        }
    }
}

問題はAMF本体のシリアル化と逆シリアル化によるものだと思います。事実上、リモートクラスには2つのスラッシュがエスケープされているため、次のようになりますapp\\testing\\CTest。Zend_AMFによって逆シリアル化されると、スラッシュが2つあるため、バックスラッシュが次のようにエスケープされますapp\testing\CTest。これはもちろん単なる予感ですが、チャールズとのいくつかのテストはこれが事実であることを証明しました。

別の可能な解決策は、を変更することZend_Amf_Parse_TypeLoader.phpです。99行目では、次のように置き換えることができます。

 if(!$class) {
            $class = str_replace('.', '_', $className);
  }

if(!$class) {
     $class = str_replace('.', '\\', $className);
}

事実上、クラスマッピングにドット構文を使用するだけで、actionscriptは次のようにうまく配置されます。

[RemoteClass(alias="app.testing.CTest")]

var $_explicitType = 'app.testing.CTest';

明らかにこれはかなり良い解決策ですが、Zend_AMFライブラリは将来新しいバージョンで更新されるため、ベンダーコードで変更しないことをお勧めします。今のところ、私の解決策は4つのスラッシュを使用することです。

于 2011-10-29T09:52:45.057 に答える