XOOPSの永続化アーキテクチャは基本的に、Data Mapperパターンになっている。サードパーティ製モジュールはそうじゃないものもある。
- XoopsObject : データオブジェクトの抽象クラス
- XoopsObjectHandler : マッパー。XoopsObjectをDBに保存したり、DBからXoopsObjectを再構築する抽象クラス
XoopsObjectは、ざっくり言うとキーと値から構成されるマップのようなもので、 get
で値を取得したり、set
で値を更新したりする。
XoopsObjectの具象クラス
慣習上XoopsObjectをそのまま使うことはなく、XoopsObjectを継承した具象クラスをデータオブジェクトとして使う。
XoopsObjectの継承関係一覧:
XoopsObjectHandlerの具象クラス
XoopsObjectHandlerも同様に、XoopsObjectHandlerを継承した具象クラスをマッパーとして使う。
XoopsObjectHandlerの継承関係一覧:
歴史的な経緯
- XOOPS2.0のころまで: XoopsObject、XoopsObjectHandlerだけだった。
- XOOPS Cube Legacyから: 互換性を重視するため古いORMはそのままにして、XoopsSimpleObject、XoopsObjectGenericHandlerが追加された。
このような歴史的な経緯で、現在は下記図のような継承関係になっている。
XoopsObjectGenericHandlerの継承関係:
XoopsSimpleObjectの継承関係:
…他多数
Xoops*Handlerの取得方法
xoops_gethandler
関数または、xoops_getmodulehandler
関数で取得するのが楽。前者は /html/kernel にあるハンドラーが、後者はモジュール内にあるハンドラーが取れる。
モジュール作るならXoopsObject? それともXoopsSimpleObject?
結論としては、どちらでもいい。Legacyで追加された、XoopsSimpleObject/XoopsObjectGenericHandlerのほうがAPIが強化されていたり、複製モジュール(D3)に対応しているという違いがあるだけ。