いろいろ備忘録

雑記です。

TableとEntityが別れている理由

ブログチュートリアル - パート2

 

CakePHP のモデルクラスのファイルは、 Table オブジェクトと Entity オブジェクトに分離して 存在します。

 なぜわざわざ分けたのかとググる

Why did cakephp v3 split the Model into Table and Entity? What are the advantages? - Quora

私たちは"ORM"を改良したいと思って分割しました。

以前は、次のようなコードを書いていました。

#$userに一行入れている
$ user = $ this-> User-> find( 'first');
#画面に出力
echo $ user ['User'] ['name'];


これは多くの場合「うまくいく」ものですが、これらの状況で良くないです。

- データベースの外で結果セットを変更する(書式設定などの場合)

- 同じクラスのテーブルと行の両方を指定する必要がある。
先程の例のuser ['User'] ['name']のことです。

- データ検証の悪夢。

- CakePHPが内部で何のデータをどのように処理し、何を返り値とするのか、という点でのAPIの一貫性の無さ。

 

より良いか悪いかに関わらず、古いORMを捨てて、維持しやすく、開発しやすいものにアップグレードする必要があったため、テーブル/エンティティの分割が必要でした。

 

分割したことの利点

- 結果セットの実行時変更を行うことができます。
あなたのエンティティにメソッドを追加するだけで、結果を望む方法で返すことができます。これは、エンティティを管理するためにCompositeパターンを使用できることを意味します。

- データ検証が美しくなります。
データがオブジェクトに入る前の段階で検証でき、それからエンティティへ分割する時にもオブジェクトの状態を検証できます。

- プログラムがデータをどのように扱っているか理解することが簡単になります。
あなたはエンティティをオブジェクトとして、また、連想配列としても使えます。オブジェクトは他のオブジェクトを包含するデータをもつことができますが、配列のキーが何であるかを推測する必要もなく、そのネストされたデータを推測する必要もありません。

- テーブルとエンティティのインタフェースを個別に反復処理できます。今までModelクラスの内部構造を簡単に変更することはできませんでしたが、今では(理論的には)変更することができます。

- 先程書いたコードはもっと美しくなります。

$ user = $ this-> Users-> find( 'first');
echo $ user-> name;

 

らしい。(ほぼGoogle翻訳