前回「適当にinterface作ってそっちで吸収してくれよと非常に思う」とか言ったので、とりあえず一部だけやってみた。
インターフェイス
<?php
interface ITwitterOAuthWrapper{
/**
* トークンが有効か+ユーザ情報取得
* @return stdClass
*/
public function verifyCredentials();
/**
* ツイートする
* @param String 発言内容
* @param array オプション
* @return stdClass
*/
public function tweet($text, $options = array());
/**
* ユーザ名でユーザ情報を取得
* @param String ユーザ名
* @param array オプション
* @return stdClass
*/
public function getUserInfoFromName($userName, $options = array());
/**
* ユーザIDでユーザ情報を取得
* @param String ユーザID
* @param array オプション
* @return stdClass
*/
public function getUserInfoFromId($userId, $options = array());
/* 以下略 */
}
本体
<?php
class TwitterOAuthWrapper extends TwitterOAuth implements ITwitterOAuthWrapper{
public function verifyCredentials(){
return $this->get('account/verify_credentials');
}
public function tweet($text, $options = array()){
return $this->post('statuses/update', array_merge($options, ['status'=>$text] ));
}
public function getUserInfoFromName($userName, $options = array()){
return $this->get('users/show', array_merge($options, ['screen_name'=>$userName] ));
}
public function getUserInfoFromId($userId, $options = array()){
return $this->get('users/show', array_merge($options, ['user_id'=>$userId] ));
}
}
使い方
<?php
// TwitterOAuthWrapper
require_once('twitteroauth/TwitterOAuthWrapper.php');
$TwitterOAuth = new TwitterOAuthWrapper('コンシューマキー', 'コンシューマシークレット', 'アクセストークン', 'アクセスシークレット');
// トークンが有効か+ユーザ情報取得
$user = $TwitterOAuth->verifyCredentials();
// つぶやく
$status = $TwitterOAuth->tweet('ツイート内容');
// ユーザ情報を取得
$userinfo = $TwitterOAuth->getUserInfoFromName('ユーザ名');
$userinfo = $TwitterOAuth->getUserInfoFromId('ユーザID');
// 元々の使い方も一応可能
$status = $TwitterOAuth->post('statuses/update', ['status' =>'ツイート内容']);
使い方はITwitterOAuthWrapperの解説通りにメソッドを呼び出すだけ。
あとは必要に応じてインターフェイスとその実体を追加していくだけです。
こういう作りにして何がうれしいかというと、仕様変更に強くなる点。
もしツイートするURLが'statuses/update'から他に変わったとします。
元々の作りのように、呼び出し側にこのURLが書いてあった場合、ツイートしているところを全て書き直さなければなりません。
しかしTwitterOAuthWrapperであれば、tweetメソッド一箇所書き換えるだけでおわりです。
まあちょっと適当な作りなので、正直あまり気に入ってないです。
このまま実装を続けると、TwitterOAuthWrapperには延々ほぼ同じ呼び出し方のメソッドが並ぶ羽目になります。
なのでURLやリクエストメソッドなどは設定に持っておいて__callで一括処理とかしたかったわけですよ。
しかしinterfaceのメソッドは必ず実装が必要で、__callで受け取れないという。ぐぬぬ(当たり前)
そこでITwitterOAuthWrapperをimplementsしないというナイスな解決手段を思いついたのだがどうだろう。