29.5. Zend_Service_Delicious

29.5.1. 導入

Zend_Service_Delicious は、 del.icio.us の XML および JSON ウェブサービスを使用するためのシンプルな API です。 このコンポーネントによって、del.icio.us への投稿のうち、 権限を持っているものについての読み書きが可能になります。 全ユーザの公開データへの読み込み専用のアクセスも可能です。

例 29.13. すべての投稿の取得

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');
$posts = $delicious->getAllPosts();

foreach ($posts as $post) {
    echo "--\n";
    echo "タイトル: {$post->getTitle()}\n";
    echo "URL: {$post->getUrl()}\n";
}
?>

29.5.2. 投稿の取得

Zend_Service_Delicious には、投稿を取得するメソッドとして getPosts()getRecentPosts() および getAllPosts() の三種類があります。 これらはすべて Zend_Service_Delicious_PostList のインスタンスを返します。ここに、取得したすべての投稿が含まれます。

<?php
/**
 * 引数にマッチする投稿を取得する。日付や url を省略した場合は、直近の日付を使用する
 *
 * @param string $tag オプションで、タグによる絞込みを行う
 * @param Zend_Date $dt オプションで、日付による絞込みを行う
 * @param string $url オプションで、url による絞込みを行う
 * @return Zend_Service_Delicious_PostList
 */
public function getPosts($tag = null, $dt = null, $url = null);

/**
 * 直近の投稿を取得する
 *
 * @param string $tag   オプションで、タグによる絞込みを行う
 * @param string $count 返す投稿の最大数 (デフォルトは 15)
 * @return Zend_Service_Delicious_PostList
 */
public function getRecentPosts($tag = null, $count = 15);

/**
 * すべての投稿を取得する
 *
 * @param string $tag オプションで、タグによる絞込みを行う
 * @return Zend_Service_Delicious_PostList
 */
public function getAllPosts($tag = null);
?>

29.5.3. Zend_Service_Delicious_PostList

データへのアクセスを簡単に行うため、このクラスは CountableIterator および ArrayAccess の三つのインターフェイスを実装しています。

例 29.14. 投稿一覧へのアクセス

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');
$posts = $delicious->getAllPosts();

// 投稿数を数えます
echo count($posts);

// 投稿を順次処理します
foreach ($posts as $post) {
    echo "--\n";
    echo "タイトル: {$post->getTitle()}\n";
    echo "URL: {$post->getUrl()}\n";
}

// 配列風のアクセス方式で投稿を取得します
echo $posts[0]->getTitle();
?>
[注意] 注意

メソッド ArrayAccess::offsetSet() および ArrayAccess::offsetUnset() は、この実装では例外をスローします。つまり、unset($posts[0]);$posts[0] = 'A'; といったコードを書くと例外が発生するということです。 というのも、これらのプロパティは読み込み専用だからです。

29.5.4. 投稿の編集

例 29.15. 投稿の編集

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');
$posts = $delicious->getPosts();

// タイトルを設定します
$posts[0]->setTitle('新しいタイトル');
// 変更を保存します
$posts[0]->save();
?>

例 29.16. メソッドコールの連結

すべての設定用メソッドは post オブジェクトを返すので、 「流暢なインターフェイス」を使用してメソッドコールを連結することができます。

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');
$posts = $delicious->getPosts();

$posts[0]->setTitle('新しいタイトル')
         ->setNotes('新しいメモ')
         ->save();
?>

29.5.5. 投稿の削除

投稿を削除する方法は二通りあります。 投稿の URL を指定するか、post オブジェクトの delete() メソッドを実行するかのいずれかです。

例 29.17. 投稿の削除

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');

// URL を指定します
$delicious->deletePost('http://framework.zend.com');

// あるいは、post オブジェクトのメソッドをコールします
$posts = $delicious->getPosts();
$posts[0]->delete();

// deletePost() を使用する、もうひとつの方法
$delicious->deletePost($posts[0]->getUrl());
?>

29.5.6. 新しい投稿の追加

投稿を追加するには createNewPost() メソッドをコールする必要があります。 このメソッドは Zend_Service_Delicious_Post オブジェクトを返します。 投稿を編集したら、それを del.icio.us のデータベースに保存するために save() メソッドをコールします。

例 29.18. 投稿の追加

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');

// 新しい投稿を作成し、保存します (メソッドコールの連結を使用します)
$delicious->createNewPost('Zend Framework', 'http://framework.zend.com')
          ->setNotes('Zend Framework Homepage')
          ->save();

// 新しい投稿を作成し、保存します (メソッドコールの連結を使用しません)
$newPost = $delicious->createNewPost('Zend Framework', 'http://framework.zend.com');
$newPost->setNotes('Zend Framework Homepage');
$newPost->save();
?>

29.5.7. タグ

例 29.19. タグ

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');

// すべてのタグを取得します
print_r($delicious->getTags());

// タグ ZF の名前を zendFramework に変更します
$delicious->renameTag('ZF', 'zendFramework');
?>

29.5.8. バンドル

例 29.20. バンドル

<?php
$delicious = new Zend_Service_Delicious('ユーザ名', 'パスワード');

// すべてのバンドルを取得します
print_r($delicious->getBundles());

// someBundle というバンドルを削除します
$delicious->deleteBundle('someBundle');

// バンドルを追加します
$delicious->addBundle('newBundle', array('tag1', 'tag2'));
?>

29.5.9. 公開データ

del.icio.us のウェブ API を使用すると、全ユーザの公開データにアクセスできるようになります。

表 29.10. 公開データを取得するためのメソッド

名前 説明 返り値の型
getUserFans() あるユーザのファンを取得します Array
getUserNetwork() あるユーザのネットワークを取得します Array
getUserPosts() あるユーザの投稿を取得します Zend_Service_Delicious_PostList
getUserTags() あるユーザのタグを取得します Array
[注意] 注意

これらのメソッドを使用するだけなら、 Zend_Service_Delicious オブジェクトの作成時に ユーザ名とパスワードを指定する必要はありません。

例 29.21. 公開データの取得

<?php
// ユーザ名とパスワードは不要です
$delicious = new Zend_Service_Delicious();

// someUser のファンを取得します
print_r($delicious->getUserFans('someUser'));

// someUser のネットワークを取得します
print_r($delicious->getUserNetwork('someUser'));

// someUser のタグを取得します
print_r($delicious->getUserTags('someUser'));
?>

29.5.9.1. 公開投稿

公開投稿を getUserPosts() メソッドで取得すると、 Zend_Service_Delicious_PostList オブジェクトが返されます。ここには Zend_Service_Delicious_SimplePost オブジェクトが含まれ、 その中には URL やタイトル、メモ、タグといった投稿に関する基本情報が含まれます。

表 29.11. Zend_Service_Delicious_SimplePost クラスのメソッド

名前 説明 返り値の型
getNotes() 投稿のメモを返します String
getTags() 投稿のタグを返します Array
getTitle() 投稿のタイトルを返します String
getUrl() 投稿の URL を返します String

29.5.10. HTTP クライアント

Zend_Service_Delicious は、Zend_Rest_Client を使用して del.icio.us ウェブサービスへの HTTP リクエストを作成します。 Zend_Service_Delicious が使用する HTTP クライアントを変更するには、Zend_Rest_Client の HTTP クライアントを変更する必要があります。

例 29.22. Zend_Rest_Client の HTTP クライアントの変更

<?php
$myHttpClient = new My_Http_Client();
Zend_Rest_Client::setHttpClient($myHttpClient);
?>

Zend_Service_Delicious で複数のリクエストを作成する際に それを高速化するなら、接続をキープするように HTTP クライアントを設定するとよいでしょう。

例 29.23. HTTP クライアントを、接続を保持し続けるように設定する

<?php
Zend_Rest_Client::getHttpClient()->setConfig(array(
        'keepalive' => true
));
?>
[注意] 注意

Zend_Service_Delicious オブジェクトを作成する際に、 Zend_Rest_Client の SSL トランスポートは 'ssl' と設定されます。デフォルトの 'ssl2' ではありません。これは、del.icio.us 側の問題で、 'ssl2' を使用するとリクエストの処理に時間がかかる (ほぼ 2 秒くらい) ためです。