2011-10-29 7 views
1

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

私が直面している問題は、フレックスからPHPおよびPHP側で型付きオブジェクトをstdClassの代わりに型付きオブジェクトとして受け取れるようにすることです。ここで

はフレックスでクラスです:

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

     public var stuff1:String; 

     public var stuff2:String; 

     public function CTest() 
     { 
     } 
    } 
} 

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

<?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という変数に取り込まれます。 Iその後、結果をファイルに書き込むためにそれを使用します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が見るクラス名になります。名前空間記法を使用すると、すべてのスラッシュが取り除かれるため、Zend_AMFはmodulestestingCTestと見なします。

しかし、これをPHPネームスペースでどのように動作させることができますか?

答えて

2

最後に問題を解決しました。将来的に同じ問題に遭遇する可能性のある人たちのためのソリューションです。あなたのPHPクラスの

:あなたのActionScriptクラスについては

<?php 
namespace app\testing; 
class CTest{ 

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

    var $stuff1; 

    var $stuff2; 
} 

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にエスケープされます。これはちょうどちょうど馬鹿ですが、チャールズとのいくつかのテストは、これが事実であることを証明しました。

もう1つの解決策は、Zend_Amf_Parse_TypeLoader.phpを変更することです。99行で、私たちは置き換えることができます:

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

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

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

効果的

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

で、私たちはその後、ちょうどとうまく配置されますActionScriptのクラスのマッピングのためのドット構文を使用することができます

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

+0

もし私があなたに2倍の投票権を与えることができたら:PHPからFlexへのオブジェクトの送信に関する私の関連する質問:http://stackoverflow.com/questions/9555397/flex-is-deserializing-generic-objects-from- zend-amf-strict-of-strictly-typed-ob – pixel

関連する問題