Ethnaは標準でXML-RPCに対応しているので、
# ethna add-action-xmlrpc hoge
とやるだけで app/action-xmlrpc にActionのテンプレートが作れますし、クライアントからHogeメソッドをコールすると、自動的にHogeアクションが実行されます。
(エントリポイントはindex.phpではなくxmlrpc.phpになります)
しかし、デフォルトでは引数がActionFormのform定義と順番に1対1で対応するため、引数が多くなると使いづらくなります。
ここは、PHPらしく引数名をキーにした連想配列にしたいところ。
(プロジェクト名)_Controller に以下のメソッドを定義(オーバーライド)することで、XMLRPCの第一引数を連想配列として扱い、対応する名前のformに値がセットされるようになります。
function trigger_XMLRPC($method, $param)
{
// アクション定義の取得
$action_obj =& $this->_getAction($method);
if (is_null($action_obj)) {
return Ethna::raiseError("undefined xmlrpc method [%s]", E_APP_UNDEFINED_ACTION, $method);
}
// オブジェクト生成
$backend =& $this->getBackend();
$form_name = $this->getActionFormName($method);
$this->action_form =& new $form_name($this);
$def = $this->action_form->getDef();
/***** ここから変更 *****/
if (isset($param[0]) && is_array($param[0]))
{
foreach ($param[0] as $key => $value)
{
if (isset($def[$key]))
{
$this->action_form->set($key, $value);
}
}
}
/***** ここまで変更 *****/
// バックエンド処理実行
$backend->setActionForm($this->action_form);
$session =& $this->getSession();
$session->restore();
$r = $backend->perform($method);
return $r;
}
これで、クライアント側では引数の順番を気にせずに済みます。