コネクタとしての BEAR.Resource について考えたこと
BEAR.Sunday Advent Calendar 2015 6日目の記事です。(※記事の公開が予定よりも遅れてしまいました。すみません。)
RESTfulフレームワークである BEAR.Sunday を使う機会がありました。 使ってみて考えたことを書きたいと思います。この記事では、まずコネクタとしてのリソース(BEAR.Resource)について説明します。リソースの単位を
1. 名詞的情報にした場合と、 2. ドメインユースケースにした場合
についてそれぞれ特徴を検討します。後者については説明用に動作するスニペットを組みました。
BEAR.Resource とは
BEAR.Sunday を構成するオブジェクトフレームワークの1つに BEAR.Resource があります。READMEには下記の記述があります。
BEAR.Resource はオブジェクトがリソースの振る舞いを持つHypermediaフレームワークです。 クライアントーサーバー、統一インターフェイス、ステートレス、相互接続したリソース表現、レイヤードコンポーネント等の RESTのWebサービスの特徴をオブジェクトに持たせる事ができます。 既存のドメインモデルやアプリケーションの持つ情報を柔軟で長期運用を可能にするために、 アプリケーションをRESTセントリックなものにしAPI駆動開発を可能にします。
リソースオブジェクトは、WebのURIと同じような page://self/index などのURIを持ち、HTTPのメソッド(GET/POST/PUT/DELETE)に準じたインターフェイスを持ちます。
コネクタとビジネスコンポーネントの関係
BEARでWebページを作る場合、「ページリソース」が「アプリケーションリソース」を呼び出す形になります。 アプリケーションリソースを使う意図について、フレームワーク作者の郡山さんに質問したところ、下記のような回答を頂きました。
Mike Amundsen(@mamund) さんの来日講演で、継続開発可能性のために、アプリケーションは情報を接続するコネクティングレイヤーとビジネスロジックのためのコンポーネントレイヤーの二層が必要だというのがありました。 BEARのリソースは前者の情報の接続のためのレイヤーです。
※コネクタ(接続レイヤー)とコンポーネントについての詳細は、資料 RESTとAPI設計のためのガイド / A Guide to REST and API Design eBook に記述があります。
アプリケーションリソースの基準は何か?
では、アプリケーションリソースの粒度、最小単位(= 再利用の単位)を何にするのか?考えてみたいと思います。
パターン1:リソースを名詞的情報とする
たとえば、公式チュートリアルの例だと下記です。
ref. bearsunday/MyVendor.Weekday
業務上意味のある名詞である情報をリソースにするパターンです。この基準を採る場合の特徴について、下記のように考えました。
メリット:BEAR.Resource の諸機能(URI、リンク、外部アプリケーションのインポート、キャッシュ等)を細粒度から使える
課題:OOP、責務駆動設計、ドメイン駆動設計と蓄積されてきたような、型制約を活かした設計を採り入れる場合の実装方法?
たとえば、下記のような問題の構造をそのまま意図としてコードに表すのがDDDのビルディングブロックの考え方でした。クラスの型、名前、振る舞い等で部品の責務を限定することでリッチな語彙を作っていきます。
エンティティをリソースに、ユースケースをリソースに、サービスは?、URI制約から型への変換が要る・・・と実装を考えたときにうまくおさまらないように私は感じました。
パターン2:リソースをドメインユースケースとする
ユースケースクラスをリソースにインジェクトするパターンです。「Domain Kata」 のサンプルアプリケーションを見て、サンプルのモデル部分をBEARアプリケーションから呼び出すスニペットを実装してみました。(Doctrine 注入については文末掲載の参考リンクを参照させて頂き、助かりました。ありがとうございます。)
kumamidori/SnippetUserRegistration
メリット:URIでユースケースの再利用が可能、モデルの意図性
課題:ユースケースから利用される側のクラスでは BEAR.Resource の諸機能がデフォルトでは使えない
2パターン挙げましたが、前者パターンで部分的にサービスをリソースにインジェクトする形もあります。 最後に、まとめ・・・としたいところですが、結論のようなものは現時点ではありません。 この記事を書くにあたって、こんな記事(奥さんに REST をどう説明したかというと…)を発見してのんびり読んだりして、楽しかったです・・・。
関連記事
ドメインモデルのための型「Domain Kata」を使ってみました
Kata #1 - サービス(SERVICES)
参考リンク
BEAR.SundayでDoctrine2のORMを使ってみた(改) — A Day in Serenity (Reloaded) — PHP, FuelPHP, Linux or something
BEAR.SundayでDoctrine2のORMを使ってみた - Qiita










