BEARで始めるWebアプリケーション開発 その7「複数のリソースからデータを取得して画面に表示する」

今回は、前回作成したリソースを使って、"逆さ語"の画面に"最近変換した文章"を表示させてみます。

ページに表示するリソースを定義する

と言ってもそんなに難しくもなく、以前作成したページのonInitメソッドにちょこっと追加するだけになります。

<?php
    /**
     * 初期化
     *
     * @return void
     */
    public function onInit(array $args)
    {
        // 文章が与えられていたらsentencesリソースに書き込む
        if ( isset($args['s']) === true ) {
            $values = array('s' => $args['s']);
            $params = array(
                            'uri' => 'sentences',
                            'values' => $values,
                            'options' => array(),
                           );
            $this->_resource->create($params);
        }

        // sentencesリソースから最近変換した文章のリストを取得する
        $params = array('uri' => 'sentences');
        $this->_resource->read($params)->set('history');

        // 文章の変換結果を取得する
        $uri = 'sentence';
        $sentence = ( isset($args['s']) ? $args['s']
                      : 'これはサンプルです' );
        $values = array('s' => $sentence);
        $params = array(
                        'uri' => $uri,
                        'values' => $values,
                        'options' => array(),
                       );
        $this->_resource->read($params)->set('preview');
        $this->set('sentence', $sentence);
    }
?>

"ちょこっと"と言いながら、何だかいっぱい増えてしまってますが…。

最初のブロックでは、文章が与えられてページが呼ばれた場合に、文章変換の履歴として、sentencesリソースに書き込んでいます。

真ん中のブロックでは、sentencesにGETリクエストを投げて、最近変換した文章のリストを取得しています。

最後のブロックは以前のまま変更はありません。

これでテンプレートの$historyに最近変換した文章がアサインされるので、後はテンプレート側で適当に見た目を整えてやればオッケーですね。

BEARではリソースに対して、HTTPでアクセスするのと同じ感覚でアクセスできるので、ページからアクセスする場合は、このように必要なリソースアクセスを順番に並べていく感じになります。

今回は利用したリソースが同じアプリ内のものだけでしたが、ここに例えば外部URLのRSSフィードを追加したり、都道府県一覧を定義してあるCSVを読み込んで使ったり、というように、様々な情報を"リソース"という形で簡単に追加していけるという事が分かって頂けるのではないかと思います。

これはかなり強力な仕組みで、例えば「ブログサイトを作ろう」という事で、メインとなる記事の表示・投稿機能なんかをリソースとして作った後に、「コメント機能を追加しよう」とか「ブログパーツを入れよう」とか「twitterの関連つぶやきを載せたいな」とか仕様が増えても、後から非常に簡単に機能を追加する事ができます。*1

これに更に"リンク"の機能を使うと、リソース同士を組み合わせて付加価値を付けた情報を取得したりなんて事ができるようになるので、更にできる事の幅が広がるようになります。

次回は?

という事で、次回は、リソース同士の関連付けを定義する、"リンク"について学習したいと思います。

*1:この辺り、MVCCakePHPとかだと、どういう設計・実装になるのかな…? MVCフレームワークで大きな規模の開発をした事がないので、素朴な疑問です…。