Skip to content

notes:Resourceの基本

HIKAWA Kilica edited this page Jan 29, 2015 · 5 revisions

CoBEAR でモジュールを開発する際の概略を説明します。概略なので、諸々省略していますのでご了承ください。 なんとなく、こんな感じなんだ、というのを掴んでいただければと思います。

BEAR.Sunday では Resource を基本的な単位として、Resource に対して get, post, put, delete の4種類の操作を行うことで機能を実現します。

実装では、Resource はクラスに当たり、onGet(), onPost(), onPut(), onDelete() の4つのメソッドを用意します(リソースによっては、onGet()onPost() しかなかったりします)。

このクラスは、通常の MVC では概ね Model に相当します(注:BEAR.Sunday を知ってる方へ:ここでは App Resource を解説しています)。

例えば、ニュースモジュールの「トピック」を表示するのであれば、次のようなクラスを用意します。

class Topic extends ResourceObject
{
  public function onGet($topicId)
  {
    $this->topic = $this->db->findOne($topicId);
    return $this;
  }
}

何となく分かるかと思いますが、渡された $topicId でデータベースから topic オブジェクトを取得し、$this にセットしています。 実際には、この db はまだ何を採用するか決まってませんので、多少書き方は変わるかもしれませんが、こんな感じです。

あとは、テンプレートで $topic を使ってどう表示するかを決めてやります。とても簡単ですね。

POSTされたトピックをサーバに保存する場合はこんなかんじです。さっきの Topic クラスに、onPost() メソッドを追加します。

class Topic extends ResourceObject
{
  public function onGet($topicId)
  {
    // 省略
  }

  public function onPost($request)
  {
    $topic = $this->db->create();
    $topic->setValues($request)->save();
    $this->topic = $topic;

    $this->code = 204;
    return $this;
  }
}

とてもわかり易いですね。現実には、これにバリデーションとかユーザーパーミッションのチェックとか加わるのですが、そこはたぶん DI/AOP を使って別で処理するので、Resource クラスはとてもシンプルに書くことができると思います。

Page リソースと App リソース

さて実は、「リソース」には2種類あります。Page リソースと App リソースです。先ほど紹介したのは App リソースです。

じゃあ Page リソースって何だ、というと、MVC でいうところのコントローラに概ね該当します。

Page リソースの実装も App リソースと同じく、クラスを作って onGet(), onPost() などのメソッドを追加します。 BEAR.Sunday の Page リソースは、これらのメソッド内で、App リソースを呼び出し、組み立てるような役割を持ちます。

class View extends ResourceObject
{
    public function onGet($topicId=null)
    {
        if (! $id) {    // list
            $this->page = $this->resource->get->uri('app://self/topic/collection');
        }
        else {  // detail
            $this->page = $this->resource->get->uri('app://self/topic')->withQuery(['toicId'=>$topicId]);
        }
        return $this;
    }
}

app://self/topicapp://self/topic/collection で指定されているのが App リソースです。このようにリソースには URI が割り当てられています。

場合によっては、Page リソースの中で複数の App リソースを呼び出すこともあるでしょう。

このように、BEAR.Sunday で作られたサイトにリクエストがあると、

  • そのURLを元に router が適切な Page リソースを呼び出す
  • router に呼び出された Page リソースが、App リソースを呼び出す
  • App リソースがDBにアクセスしたりしてページの構成要素を集めてくる。

という順番に処理が行われます。

Clone this wiki locally