[PHP] DBフレームワークAtlasの紹介
こんにちは、ナカエです。
本日は、データベースフレームワークAtlasの紹介記事です。
Atalsは、高品質なPHPコンポーネント群 Auraの開発のリードとして知られるPaul M. Jones氏により2015年から開発が続けられており、現在v3 "Cassinie"が最新のバージョンです。
この記事はフレームワーク自体の説明になります。
個別のパッケージの使い方は随時更新していきます。
永続化モデル
Atlasは永続化モデルによる作業に役立つPHPのデータベースフレームワークです。 必要に応じて、より豊かなドメインモデルへのリファクタリングのための道筋を提供します。
Atlasのドキュメントには永続化モデル(Persistence Model)という言葉が繰り返し出てきます。
永続化モデルとはビジネスドメインのモデルとは別のデータストアのためのモデルです。例えばRDBのような表形式のデータベースを使っている場合は、テーブルやその行の抽象を指します。
永続化モデル設計のトレードオフ
よくあるActiveRecord系のORMを使う場合はドメインモデルと永続化モデルは区別されないことが多く、行オブジェクトの中に永続化のためのロジックとドメインロジックが混在しています。 DBの読み出し・永続化の処理がほとんどを占めるようなアプリケーションにおいてこの手法は非常に有効で、 少ない記述量で高速なアプリケーションの実装が可能になっています。
しかし、プロジェクトが大きく複雑になっていくにつれ、DBの事情と切り離されたクリーンなドメインモデルを得たくなってくる場合があります。ドメインモデルと永続化モデルを陽に分けることは記述量の増加をもたらしますが、その代わりに疎結合のメリットを享受することができます。
この問題の厄介なところは、プロジェクト初期にはドメインモデルと永続化モデルを切り離さなくても十分だと判断していても、後になって予想を超えて複雑化し、この判断が裏切られる場合があることです。
すべてのアプリケーションで2つのモデルを陽に分けると不必要に作業量が増加し、逆にすべてにおいて区別しないと複雑化したプロジェクトにおいて密結合の奈落にはまります。
Atlasはこのトレードオフをいい感じに解決しようとするフレームワークです。 最初にドメインモデルと永続化モデルの2つの顔を持つクラスを作成しても、段階的に両者を切り離すまでの道筋が示されています。
※ このリファクタリングはActiveRecord系のORMでも可能なので、Atalsは永続化モデルとこのリファクタリングの道筋に適した機能の取捨選択が行われている、というのが正確なところです。 参考: Laravelとドメインモデルと永続化モデル
2014年に提唱されたADRパターンにも見られるように、開発者のPaul M. Jones氏は、ドメインモデルを念頭に置き、ドメインに専念するためのパッケージや手法の開発に熱心だなと個人的に感じています。
パッケージのスタック
Atlasのメインは永続化モデルを意識したDataMapper系ORMと言えますが、このORMの部品となる下位パッケージ群は独立したライブラリとして利用することができます。上位のパッケージは一つ下のパッケージに依存しているのが特徴です。このパッケージのスタック構造がAtlasを"ORM"ではなく"データベースフレームワーク"と呼称する理由の一つと思われます。
Atlas.Pdo
Atlas.Pdo はDBコネクションオブジェクトとそのロケータを提供します。 PDOの便利なラッパーになっていて、結果をまとめて取得するfetch系のメソッドとGeneratorを返すyield系のメソッドを持ちます。
Atlas.Query
Atlas.Query はAtlas.Pdoをラップしたクエリビルダーです。クエリオブジェクトによって、SQLクエリをオブジェクト指向的に扱うことができます。
Atlas.Table
Atlas.TableはAtlas.Queryの上に作られたTable Data Gatewayの実装です。Data Mapperを必要とせず、テーブルと行オブジェクトのみを扱いたいときに役立ちます。
Atlas.Mapper
Atlas.Mapper はテーブル間のリレーションシップをモデル化したData Mapper実装です。RecordオブジェクトとRecordSetオブジェクトにより、リレーションシップを含むDBレコードのグラフをデータベースから取り出したり永続化したりできます。
Atlas.Orm
Atlas.ORMは包括的なORMパッケージです。Atlas.Mapperの上の便利なラッパーとなっています。いくつかのトランザクションの戦略を使い分けることができます。
そのほかの特徴
- 一部ボイラープレートコードがあるのでスケルトンのジェネレータがある
- PhpStorm用の補完の仕組みがある
- アノテーションの利用はなし
- Lazy Loadingはサポートせず
- DBのデータ型の抽象はなし
- 複合主キー・複合外部キー対応
使った感想
結果取得用のfetch系のメソッドとyields系のメソッドが多く用意されているくらいで、ほかのメソッドは最小限で把握しやすいですね。 Atlas.ORMのTableクラス用に書かなければならないコードを見てその行数に一瞬ギョッとしましたが、ジェネレータを使えば手間ではありませんでした。 下位2つのパッケージはAura.SQLやAura.SqlQueryの改良版といった印象です。個人的にAtlas.Queryが好みでした。いつも通り、小クラス主義のコードが綺麗なので勉強になります。
次回以降の記事で個々のパッケージを紹介していきたいと思います。