AMFPHP1.9b2のカスタムマッピングでハマる

かなり忙しい。。。


AMFPHPの案件がいくつか続いています。
それぞれ環境が違い、
PHP4と5、AMFPHP1.2と1.9 とを行き来して頭の中めちゃんこめちゃんこめっちゃんこです。


で本題ですが

AMFPHP1.9b2で

AS側のDTOPHPに渡るとArrayになる件でちょっとはまったので書いときます。
忘れるから。


まず先に

自作DtoオブジェクトなどをAS⇒PHPにてマッピングするには以下の手順を行います。


1)ASのDtoクラスをつくる

2)ASのDtoクラスにRemoteClassメタを書く。

こんな具合

package com.example.dto{
	[RemoteClass(alias = "com.example.dto.HogeDto")]
	public class HogeDto{
		・・・
	}
}

Flashなど、FlexじゃないAS3はこれ↓をどこか(自作NetConnectionクラスなど)に記述してやる。

registerClassAlias("com.example.dto.HogeDto", HogeDto);

3)ASに対応したPHPDtoクラスをつくる

4)PHPDtoクラスに$_explicitTypeをかく

こんな具合

class HogeDto{
	// PHP5系だとpublicをつけるんかな。。
	var $_explicitType = "com.example.dto.HogeDto";
	・・・
}

5)amfphp/global.phpに$voPathをかきかえる

DTOクラスの置き場所は、amfphpディレクトリ直下にdtoディレクトリを作成してそこに置くことが多いです。僕は。

ASのパッケージ構成に合わせてdtoディレクトリ配下にフォルダを切ったほうが良いと思います。

んで、globals.php

	$voPath = "dto/";

と指定してやる。
amfphpのディレクトリ以外の場所に置くときは絶対パスで書くんだと思います。

これでAS - PHP の自作DTOでやり取りができる。

はず、なのにできない。なんでやねん


PHPのサービスクラスにきたときにはもうArrayになってる。。(PHP4。PHP5は検証してないです)

んで悩むこと2時間モア。

core/amf/io/AMFBaseDeserializer.php(380行目前後)に答えが。。

PHPDTOは拡張子「.php」または「.class.php」が正解なようです。


僕はHogeDto.class.incってしてました。


素直に.php(または.class.php)にするか、AMFBaseDeserializer.phpに追記してあげましょう。


でした。


PHP⇒ASの戻り値でのマッピング注意は、AS側で該当Dtoクラスを「使ってやる」ことです。でないとObjectで返ってきます。


結論:
やっぱりちゃんとソース読んでから使わないといけませんね。。
ごめんなさい。



ところで僕はAMFEXTは使っていません。
そのうち試してみたいと思います。