1

昨天,根据这个问题,我成功地使用 Zend_AMF 将类型对象从 PHP 应用程序发送到 flex 前端。

我现在面临的问题是我想将一个类型化对象从 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;
}

在 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 命名空间一起使用呢?

4

1 回答 1

2

终于解决了这个问题。这是将来可能遇到相同问题的人的解决方案。

对于您的 PHP 类:

<?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. 当然,这只是一种预感,但对查尔斯的一些测试证明确实如此。

另一种可能的解决方案是修改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 回答