CakePHP の Model クラス
CakePHP はデータベースのテーブルをモデルとして考え、ActiveRecord1行はただの配列(構造体)で取り扱う。そのため、データの操作のメソッドを書くことはできず、保存時に初めて構造体の各フィールドに正しく値を入れたかどうかが分かるという仕組みになっている。想像だが、単なる代入にすぎない setter/getter を大量に書くより、イコールで左辺と右辺を繋げた方が視認上よいと考えたのではないだろうか。速度的な優位性もあるのかもしれない。
CakePHPは業務上の利用をメインに置いていると考えられるので、開発者同士がよほど酷いディスコミュニケーションを発生させない限り、問題はないのだろう。
「モデルと絡むモデル」の取り扱いも、それを操作するコントローラ側に記述する必要があるようだ。
<?php function add() { if (!empty($this->data)) { //We can save the Post data: //it should be in $this->data['Post'] $this->Post->save($this->data); //Now, we'll need to save the Comment data //But first, we need to know the ID for the //Post we just saved... $post_id = $this->Post->getLastInsertId(); //Now we add this information to the save data //and save the comment. $this->data['Comment']['post_id'] = $post_id; //Because our Post hasMany Comments, we can access //the Comment model through the Post model: $this->Post->Comment->save($this->data); } } ?>
オフィシャルのサンプルにはそのようなコードがある。これも業務上は現実的に問題がないのかもしれない。
コントローラがモデルの(密着な)操作をして終わり、という話なのであれば、XOOPSのようなフリーソフトの世界で、作者Aのプログラムが、作者Bのプログラムと連携するには、どうすればいいのだろう。他人のプログラムのデータモデルを密に直接触るケースは最小に抑えたい。
XOOPS Cube はここで同サイト内におけるウェブサービスによる通信、という主張を持ち出している。しかし忙殺デッドロックのようなコミュニティ上の問題を考えると、モデルにアクセスできるほうがいいだろう。そのとき、構造体でアクセスしてください、複合的なモデルは事情を把握して正しく操作してください、でいいのだろうか?