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>