1

Flex 4.6 データ サービスからネイティブ PHP クラスを返す際に問題が発生しています。

別の PHP クラス (CustomerData) の配列を含む PHP クラス (CustomerDataResponse) を返すと、PHP で CustomerData クラスをキャストできません。Data Servive ウィザードはクラスを正しく検出し、サービスのテストは正常に機能しますが、customers 配列をデバッガーでヒットすると、CustomerData の配列ではなく、オブジェクトの配列で満たされているようです。

同じメンバーで stdClass() を返すように PHP を変更し、データ ウィザードを再実行すると、クラスに名前を付ける必要がありますが、キャストは正しく機能します。

また、cr.lastResult のキャストは正常に機能します。cr.customers.getItemAt(0) のみがオブジェクトであり、customerdata ではないようです。はい、getITemAt(0) が null ではないことも確認しました。

助言がありますか?stdClass を使用することもできますが、PHP クラスの方がはるかに使いやすいです。

PHP クラス (簡潔にするためにトリミングされています)

CustomerData.php

class CustomerData {
    public $name;
    public $phoneNumber;

    function __construct(){
        //initialize some values
    }
}

CustomerDataResponse.php:

require_once 'CustomerData.php';
class CustomerDataResponse {

    public $message;
    public $status;
    public $customers;

    function __construct() {
        $this->message = "";
        $this->customers = array(); //Array of CustomerData types
    }
}

CustomerService.php

require_once("Models/CustomerDataResponse.php");

class CustomerInfoService {
    private $customerDataResponse;

    public function __construct() {
        $this->customerDataResponse = new CustomerDataResponse();
    }

    public function getCustomerData(){ //Called from Flex App
        $this->customerDataResponse->customers[] = new CustomerData();
        return $this->customerDataResponse;
    }

FlexApp:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx"
               initialize="initializeHandler(event)">
    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;
            import mx.rpc.CallResponder;
            import mx.rpc.events.ResultEvent;

            import services.customerinfoservice.CustomerInfoService;

            import valueObjects.CustomerData;
            import valueObjects.CustomerResponseData;

            private var cr:CallResponder = new CallResponder();
            private var service:CustomerInfoService = new CustomerInfoService()

            protected function initializeHandler(event:FlexEvent):void{
                cr.addEventListener(ResultEvent.RESULT,handleResult);
                cr.token = service.getCustomerData();
            }

            protected function handleResult(event:ResultEvent):void{
                var crd:CustomerResponseData = cr.lastResult as CustomerResponseData; //This works fine
                var cd:CustomerData = crd.customers.getItemAt(0) as CustomerData; //This leaves cd NULL

                trace(cd.name); //Dies here: Cannot access a property or method of a null object reference
            }

        ]]>
    </fx:Script>
</s:Application>
4

0 に答える 0