CakePHP 2.0のモデルの変更点を追ってみました

CakePHP 2.0のRC1が出ましたね。驚くべきスピード。Xデーも近そうです。

https://github.com/cakephp/cakephp/tree/2.0.0-RC1

ということで、CakePHPの重要な要素であるモデルの1,3からの変更点をざっと追ってみることにしました。

結論からいうと「驚くほど変わってない!」ということ。モデル自体の挙動に関しては、コードを追っていった限りにおいて、目立った変更はないと断言して良さそうです。さすが、互換性を重視したアップデート。CakePHPで開発しているプログラマの安堵の声が聞こえてきそうです。


ソースコードを追っていく方法ですが、オリジナルのコミットを追っていくのはなかなか厳しいです。関係ないコミットが入っていたり、途中で二転三転したり。自分のやったコミットならいいのですが、こういう場合はざっくり元のコードと最終版のコードと比較していって、変更点をgitで保存していって意図をつかんでいくという方法で追って見ることにしました。

https://github.com/basuke/cakephp/commits/TransformToModel2

最新のコミットは、寸分違わず2.0のlib/Cake/Model/Model.php と同じものになっています。

モデルの変更点

以下に重要そうなものだけ列挙してみます。これ以外のものはコードを呼んでいくために整理したコミットや、リファクタリング程度のものです。飛ばしても大丈夫そうなやつでした。

8bec517
cakeError()は廃止、例外を飛ばすようになりました。

07b6523f60
追い切れてないのですが、hasAndBelongsToMany関連のwith設定にプラグイン付きモデルを渡した場合に、正しく動作するようになった模様。

b14e8211d6
データソースの設定もlazy loadingになりました。極力先延ばしされます。

e45cc8143a
invalid()を複数呼んだ場合に、全ての値が配列で保持されるようになりました。そしてバリデーションメッセージがi18n対応。モデルごとにドメインも指定できるようになってます。

689e609501
displayFieldは __get() マジックメソッドによって処理されるように変更になりました。

cbadcbf4e3
関連のための内部情報の生成が遅延ロード対応になりました。

9a0211149c
削除時のカウンターの更新が、本当に更新の必要があるときにだけ呼び出されるように変更になりました。

daaf36fe21
find('count', ...)で、1つ以上行が返って来た場合、それら全ての値の合計を返すようになりました(これまでは先頭の一つのみ)。

f0dcecc288
リファクタリングによりsaveAllがすっきりしました。validateを行う場合、全部のバリデーションが本当に終わってから、保存が始まるようになりました。(これまでは一つ一つ、バリデーションしては保存してた)

0b1bd27f9a
新しく保存されたレコードの主キーが、$this->dataに保存されるようになりました。afterFindが呼ばれる前には設定されています。

8303549b15
Model::set()で、XMLデータを設定できるようになったようです。(SimpleXMLElement or DONNode)。よくわかりませんが、そういう要求があったのでしょうか。

11fde1f319
これらの変更の意図が最後まで分かりませんでした。正直CakePHPの経験は短いのでこの辺の意味がわかる方、出来たら教えていただけますでしょうか。

Cakephp 1.3 Application Development Cookbook

Cakephp 1.3 Application Development Cookbook