如何在 Apache Royale 中使用 AMFPHP

How to use AMFPHP with Apache Royale

我在使用 SimpleRemoteObject 时遇到问题。 (SDK 0.9.6)

我的实际网站使用此代码通过 Amfphp 调用远程功能:

<mx:RemoteObject id="ro" source="aadmin" destination="amfphp">
    <mx:method name="siteLogin" fault="{onRcv_siteLoginErr(event)}" result="{onRcv_siteLogin(event)}"/>
</mx:RemoteObject>

由于 Apache Royale 中不存在 <mx:method/> 我设置了此代码:

 </js:beads>
        <js:SimpleRemoteObject id="sro" source="aadmin" result="onResult(event)" fault="onFault(event)"
                         endPoint = "http://amfphp.myserver_url.com/gateway.php"
                         destination = "amfphp" />
 </js:beads>

aadmin 是我的 php class 服务名称

要调用我的函数,我会这样做:

 sro.send("siteLogin",["123"]);

其中 siteLogin 是我在 aadmin 中调用的函数 class

运行 这个,我有这个问题:

The class {Amf3Broker} could not be found under the class path {/home/www/amfphp/services/amfphp/Amf3Broker.php}

为什么会显示Amf3Broker?有没有人有使用 SimpleRemoteObjectamfphp 的例子?

服务器端我用https://github.com/silexlabs/amfphp-1.9

我需要设置一个 service-config.xml 文件吗?如果是,如何在编译器中使用它? (我在 compilerOptions 中尝试了 "services": "services-config.xml" 但没有用)

这是我的服务-config.xml :

<services-config>
    <services>
        <service id="amfphp-flashremoting-service" class="flex.messaging.services.RemotingService" messageTypes="flex.messaging.messages.RemotingMessage">
            <destination id="amfphp">
                <channels>
                    <channel ref="my-amfphp"/>
                </channels>
                <properties>
                    <source>*</source>
                </properties>
            </destination>
        </service>
    </services>
<channels>
    <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel">
        <endpoint uri="http://amfphp.myserver.com/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/>
        <properties><add-no-cache-headers>false</add-no-cache-headers></properties>
    </channel-definition>
</channels> 
</services-config>

现在我用 amfphp V2.0 来自 https://github.com/silexlabs/amfphp-2.0

做了一个测试

这样好一点,但是我有一个错误。 _explicitType 属性 似乎有问题。此外,我在 [requestMessage]

中没有看到我的参数('123')
    /onStatusî$flex.messaging.messages.ErrorMessage
correlationId   faultCode@ faultDetailfaultStringvUndefined property: stdClass::$_explicitType . 
<br>file:  /home/www/mysite.com/amfphpv2/Plugins/AmfphpFlexMessaging/AmfphpFlexMessaging.php 
<br>line: 113 
<br>context: Array
(
    [requestMessage] => Amfphp_Core_Amf_Message Object
        (
            [targetUri] => null
            [responseUri] => /1
            [data] => Array
                (
                    [0] => stdClass Object
                        (
                            [body] => stdClass Object
                                (
                                )

                            [clientId] => 
                            [correlationId] => 
                            [destination] => amfphp
                            [headers] => stdClass Object
                                (
                                )

                            [messageId] => EF4BF9E3-5C02-1060-1FF3-5D9781F55A31
                            [operation] => 13
                            [timeToLive] => 0
                            [timestamp] => 0
                        )

                )

        )

    [serviceRouter] => Amfphp_Core_Common_ServiceRouter Object
        (
            [serviceFolders] => Array
                (
                    [0] => /home/www/mysite.com/amfphpv2/Core/../Services/
                )

            [serviceNames2ClassFindInfo] => Array
                (
                    [AmfphpMonitorService] => Amfphp_Core_Common_ClassFindInfo Object
                        (
                            [absolutePath] => /home/www/mysite.com/amfphpv2/Plugins/AmfphpMonitor/AmfphpMonitorService.php
                            [className] => AmfphpMonitorService
                        )

                    [AmfphpDiscoveryService] => Amfphp_Core_Common_ClassFindInfo Object
                        (
                            [absolutePath] => /home/www/mysite.com/amfphpv2/Plugins/AmfphpDiscovery/AmfphpDiscoveryService.php
                            [className] => AmfphpDiscoveryService
                        )

                )

            [checkArgumentCount] => 1
        )

    [explicitTypeField] => _explicitType
)
    rootCause   

在此先感谢您的帮助...

我知道正在运行的后端(根据我自己的经验)是 Java.NET(Fluorine)AMFPHP 也必须工作。其他人尝试过,但差不多是在一年前,当时 AMF 还没有完全开发出来。现在 Royale 中的 AMF 非常健壮并且适用于除 Vector 和 Dictionary 之外的所有类型(我想这些会有一天出现,但由于是 AS3 类型,目前优先级较低)。

这里主要是使用 RemoteObjectMXRoyale 版本(mx:RemoteObject 仿真),因为这是最接近 Flex RemoteObject 的版本。 Network lib 中的其他更轻 类 作为珠子实现,是第一批来到 Royale 的珠子。但至少在我的情况下,我切换到 mx:RemoteObject,所以我可以确保其他人在同一水平上工作。

这里是一些在 0.9.6 sdk 上测试过的工作代码(请注意,如果你有 mx 库问题,你必须使用 config flex 才能使用 mx)。使用 silexlabs 的 v1.9 和 v2.0 AMFPHP 进行测试:

<fx:Declarations>
    <mx:RemoteObject id="ro"  result="onResult(event)" fault="onFault(event)" source="your-service-php-class"
                        endpoint = "https://www.your-amfphp-server.com/amfphp/gateway.php"
                        destination = "amfphp" />
</fx:Declarations>

然后在脚本中

ro.getOperation("your-php-function-to-call").send("your-param");

[更新] 重要:请务必在您的应用程序中包含此内容,否则您将遇到类似 *The class {Amf3Broker} could not be found*

的错误
<mx:beads>
    <js:ClassAliasBead />
</mx:beads>

[更新#2] 您要使用什么 config royale 但还希望 MX 库使用 MX 远程对象?方法如下: https://github.com/apache/royale-asjs/issues/495#issuecomment-539906300