2011-10-29 52 views
1

昨天,根據此question,我成功地使用Zend_AMF從PHP應用程序向Flex前端發送了輸入對象。將AMF輸入的對象從flex返回到PHP

我現在面臨的問題是,我想發送一個從flex到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中對應的類:

<?php 
namespace modules\testing; 

class CTest{ 

    var $_explicitType = 'CTest'; 

    var $stuff1; 

    var $stuff2; 
} 

在Flex中,我送像這樣的對象:

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\CTestmodules.testing.CTest。然後將$_eplicitType設置爲兩個測試的相同值。

結果是,當我使用modules.testing.CTest時,這是Zend_AMF看到的類名。如果我使用命名空間表示法,Zend_AMF會看到modulestestingCTest,因爲所有的斜槓都被刪除了。

但我怎樣才能得到這與PHP命名空間的工作?

回答

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。這當然只是一種預感,但對Charles的一些測試證明了這種情況。

另一個可能的解決方案是修改Zend_Amf_Parse_TypeLoader.php。在99行,我們可以更換:

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

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

實際上,我們可以就用點語法爲類的映射,這動作將很好地將有:

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

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

很明顯,這將是一個不錯的解決方案,但我不希望用供應商代碼進行修改,因爲Zend_AMF庫將在未來使用更新的版本進行更新。目前,我的解決方案是使用4個斜線。

+0

如果我可以我會投票你兩次:)我有關發送對象從PHP到Flex的相關問題:http://stackoverflow.com/questions/9555397/flex-is-deserializing-generic-objects-from- Zend的-AMF-INSTEAD-OF-嚴格類型的-OB – pixel