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にアクセスしたりしてページの構成要素を集めてくる。

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

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.