-
Notifications
You must be signed in to change notification settings - Fork 0
notes:Resourceの基本
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 クラスはとてもシンプルに書くことができると思います。
さて実は、「リソース」には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/topic
や app://self/topic/collection
で指定されているのが App リソースです。このようにリソースには URI が割り当てられています。
場合によっては、Page リソースの中で複数の App リソースを呼び出すこともあるでしょう。
このように、BEAR.Sunday で作られたサイトにリクエストがあると、
- そのURLを元に router が適切な Page リソースを呼び出す
- router に呼び出された Page リソースが、App リソースを呼び出す
- App リソースがDBにアクセスしたりしてページの構成要素を集めてくる。
という順番に処理が行われます。