BEARで始めるWebアプリケーション開発 その8「リンクを使ってリソース同士を接続する」

今回は、リソース同士を接続する事ができる"リンク"の機能について学習します。

今回の題材

今までは"逆さ語"を題材としてきたんですが、現状の逆さ語の仕様だとリソース同士がリンクしていなくて、題材としてはよろしくないので、他の題材を探す事にしました。

という訳で色々考えた末、リンク機能の面白さが分かるようなものがいいかなという事で、はてなブックマークの人気エントリを題材にしてみる事にしました。

はてなブックマークの人気エントリは以下のような形で、特定のURLを含むページの人気エントリをRSSで取得する事ができます。

http://b.hatena.ne.jp/entrylist?sort=count&url=http://d.hatena.ne.jp/stellaqua/&mode=rss

ただ、このRSSにはブックマークコメントは入っていないので、コメントを見る為には該当のブックマークページを見に行かなくてはいけません。

一方、特定のページに付けられたブックマークコメントは、以下のようなURLでRSSを取得する事ができます。

http://b.hatena.ne.jp/entry/rss/http://d.hatena.ne.jp/stellaqua/20090305/1236222223

という事は、人気エントリのリソースにブックマークコメントのリソースをリンクしてやれば、人気エントリのブックマークコメントが一気に取れるんじゃね?…って事で、実際にやってみましょう。

人気エントリのリソースを作る

App/Ro/bookmarks.phpというファイル名にして、onReadメソッドを以下のようにしました。

<?php
    public function onRead($values)
    {
        $resource = BEAR::dependency('BEAR_Resource');
        $uri = 'http://b.hatena.ne.jp/entrylist?sort=count&url=http://d.hatena.ne.jp/stellaqua/&mode=rss';
        $options['cache']['life'] = 60 * 60 * 3;
        $params = array('uri' => $uri, 'options' => $options);
        $result = $resource->read($params)->getBody();
        return $result;
    }
?>

毎回RSSを取得しにいくと重たくなってしまうので、今回は3時間のキャッシュを保存する設定を追加しました。

BEARはこのように、リソース、ページ、テンプレート変数など、様々な場所でいとも簡単にキャッシュを利かせる事ができるので、多くのAPIを使うようなマッシュアップサイトでも、それなりな負荷に耐えられるWebアプリケーションを簡単に作る事ができそうですね。

ブックマークコメントのリソースを作る

続いてブックマークコメントのリソースを作ります。App/Ro/comments.phpというファイル名にして、onReadメソッドを以下のようにしました。

<?php
    public function onRead($values)
    {
        $resource = BEAR::dependency('BEAR_Resource');
        $uri = 'http://b.hatena.ne.jp/entry/rss/'.$values['link'];
        $options['cache']['life'] = 60 * 60 * 3;
        $params = array('uri' => $uri, 'options' => $options);
        $results = $resource->read($params)->getBody();
        return $results;
    }
?>

$values['link']には、bookmarksリソースからリンク機能を介してブックマーク先のURLが渡ってくるので、それを使ってブックマークコメントを取得するURLを構築しています。

人気エントリリソースからブックマークコメントリソースへリンクを張る

あとはリンク元となるbookmarksリソースのonLinkメソッドに、commentsリソースへのリンク設定を書いてやる事で、リンク機能が使えるようになります。

<?php
    public function onLink ( $values )
    {
        $links['comments'] = array(
                                   'uri' => 'comments',
                                   'values' => array('link' => $values['link']),
                                  );
        return $links;
    }
?>

当然、更に別のリソースへのリンクを書く事もできますし、commentsリソースにonLinkを書けばcommentsリソースから更にリンクする事もできます。

リンク機能を使ってページから情報を取得する

このようにリンク設定を行ったリソースから関連データを取得するのは非常に簡単で、ページから以下のような感じでごっそりと必要な情報を取ってくる事ができます。

<?php
    public function onInit(array $args)
    {
        $uri = 'bookmarks';
        $params = array('uri' => $uri);
        $this->_resource->read($params)->link('comments')->set();
    }
?>

これだけで、きちんと階層構造を持って必要な情報が取ってこれます。あとは、テンプレート側で以下のようにループを回してやれば、はてブ人気エントリのブックマークコメント一覧の完成です。

{foreach from=$bookmarks item="bookmark"}
    <p>{$bookmark.title}</p>
    <ul>
    {foreach from=$bookmark.comments item="comment"}
        <li>{$comment.description|default:''}(id:{$comment.title})</li>
    {/foreach}
    </ul>
{/foreach}

上記テンプレートから若干書き換えた後のものですが、実際に動作させてみた画面は以下の通り。

こんな風に、外部API同士を組み合わせたサーバサイドのマッシュアップが非常に簡単にできるのがBEARの強みだと思います。

もちろん内部リソースとも全く同じ形で組み合わせる事ができるので、外部APIから何かしら情報を取ってきて、それに内部リソースをリンクして付加価値を付けて、Webアプリケーションとして公開…なんて事がお手軽にできそうですね!

次回は?

BEARはフォーム関連の機能は、PEAR::QuickFormが使われているんですが、QuickFormは使った事がなくてあまりよく分かっていないので、次回から何回かはフォーム関連の機能について学習していきたいと思います。

余談

今回、元々は"最新はてブられコメント一覧"が欲しいと思って、はてブを題材にして、その過程で色々調べてて知ったんですが、はてブの特定URL以下のページの最新ブックマーク一覧って、"http://b.hatena.ne.jp/bookmarklist/?url=〜"で取れるんですね。

記事の中で挙げたentrylistだとソート基準が、"今まで1件もブックマークされていないページが初めてブックマークされた日時"になるようで、古いページにブックマークが付けられてもなかなか気付けなかったんですが、これで、はてブられ状況をリアルタイムで追う事ができそうです。