AMFPHP1.9b2のカスタムマッピングでハマる
かなり忙しい。。。
AMFPHPの案件がいくつか続いています。
それぞれ環境が違い、
PHP4と5、AMFPHP1.2と1.9 とを行き来して頭の中めちゃんこめちゃんこめっちゃんこです。
で本題ですが
AMFPHP1.9b2で
AS側のDTOがPHPに渡ると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);
4)PHPのDtoクラスに$_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のディレクトリ以外の場所に置くときは絶対パスで書くんだと思います。
はず、なのにできない。なんでやねん
PHPのサービスクラスにきたときにはもうArrayになってる。。(PHP4。PHP5は検証してないです)
んで悩むこと2時間モア。
core/amf/io/AMFBaseDeserializer.php(380行目前後)に答えが。。
PHPのDTOは拡張子「.php」または「.class.php」が正解なようです。
僕はHogeDto.class.incってしてました。
素直に.php(または.class.php)にするか、AMFBaseDeserializer.phpに追記してあげましょう。
でした。
PHP⇒ASの戻り値でのマッピング注意は、AS側で該当Dtoクラスを「使ってやる」ことです。でないとObjectで返ってきます。
結論:
やっぱりちゃんとソース読んでから使わないといけませんね。。
ごめんなさい。
ところで僕はAMFEXTは使っていません。
そのうち試してみたいと思います。