XML_RPC2の使いかた間違えてた。。orz
非常に痛い間違い。つーか、なんで今まで気づかなかったんだろう。。。
Services_YouTubeでは、ドライバの選択として、xmlrpcも使用できて、その際にXML_RPC2を使っているのだが、全然機能していなかったです。すいません。Services_YouTube-0.2.1をリリースしますので、もしかして、ドライバにxmlrpcを使用する際は、0.2.1以降を使用してください。でも、結局REST使っても、xmlrpc使っても結果が同じなんだから、両方いらないような感じもするが。。。
これに気がついたのは、バグレポートで「エラーハンドリング追加したみたいだけど、xmlrpcでfatal errorが起きるよ。」ってのをいただいたからだった。で、早速調査すると全然ダメじゃん。もう、恥ずかしすぎる。。。
何がいけなかったかというと、XML_RPC2では、
$client = XML_RPC2_Client::create($url, $options);
とするんだけど、prefixがある際には、この$optionsの連想配列にarray(‘prefix’ => “hogehoge.”);って入れないといけないのね。Services_YouTubeだったら、”youtube.users.”とか”youtube.videos.”とか。最後のピリオドは忘れがちなので注意!で、そのままprefix後のメソッド名を渡したいパラメータを引数にして、コールするんだよね。やられたなー。まぁ、今回実装したのは、こんな感じ。
$parameters = array('dev_id' => 'hogehoge', 'user' => 'hogeohge');
$options = array('prefix' => 'youtube.users.');
try {
$client = XML_RPC2_Client::create('http://' . self::URL . self::XMLRPC_PATH, $options);
$result = $client->$method($parameters);
} catch ....
というわけで、Services_YouTubeのAPIは変わらないけど、内部の処理をかなり変更を加えました。あと、error_handlerのところも修正。問題があったのは、simplexml_load_stringのところだったので、parseResponseメソッドに移動しました。
なんでかっつーと、XML_RPC2で、Backendを呼んでいるところで、dl関数を使用しているのはいいんだけど、そこで、phpxmlrpc、もしくはxmlrpcがないと、E_WARNINGを吐いてしまうのだ。@dlなので、エラーを制御していると思いきや、なんてことはないE_WARNINGを拾っちゃうの。なので、XML_RPC2の処理の後で、parseする際にerror_handlerをセットすることにした。
あと、XML_RPC周りのユニットテスト追加。今日のバグはかなり情けなかったので、一気にやっちゃった。まぁ、きっとまだまだバグがあるんだろうなー。でも、少しずつ成長している自分がイイね!
あー。またTesting_Seleniumの方にバグレポートがぁ。。
Shin Ohno 2003-2012