今日の苦言
は、CakePHPのドキュメントにおける、アソシエーション・関連(hasManyなど)の説明に対して。
検索簡単!の旨ばかりが強調されているけど、実は更新機能がショボショボで、関連付けのAPIもなければ、日本語マニュアルには登録方法すら載っていない。以前は本家にも記述がなかったと思うが、最近(?)追記されたようです。
Saving Related Model Data ※ページの下の方。
しかし、これといった画期的な方法はなく、掲載されているサンプルは
↓こう。
■posts_controller.php
function add(){
//Postを保存したら、
$this->Post->save($this->data);
//Post->idを取得して、
$post_id = $this->Post->getLastInsertId();
//CommentのアソシエーションキーにPost->idをいれ、
$this->data['Comment']['post_id'] = $post_id;
//Post->Commentを通して、Commentを保存する。
$this->Post->Comment->save($this->data);
}
ビューに至っては、こんなサンプル。
<?php echo
$html->hidden('Comment/post_id', array('value'=>$post['Post']['id']));
?>
要は、関連しているオブジェクトは別々にsaveしなければならない。
・・まあ、それは良しとしよう。これから徐々にでも実装してもらえればいいです。
しかしだね、
post_id が関連キーだなんて、
モデル本人以外は、
誰も知ったこっちゃねぇんだよ。
さすがにこのサンプルには、気持ちが萎えてしまった。こんなサンプルだと、インチキMVCが蔓延してしまう。
やるなら、↓こうだと思う。
■post.php
class Post extends AppModel{
$hasMany = array( 'Comment' =>
array( 'foreignKey'=>'post_id' ) );
function addComment($data){
if( ! $this->id ) return false;
$data['Comment']['post_id'] = $this->id;
$this->Comment->save($data);
}
}
■posts_controller.php
function add(){
//Postを保存したら、
$this->Post->save($this->data);
//Commentを保存する。
$this->Post->addComment($this->data);
}
関連キー(しかもオブジェクトID)なんて、モデルの外部に漏れてはいけないのだ。
モデルの不備を他のドメインに責任転嫁するな。
モデルの不備はモデルだけで解決すべし。
モデルがほんの少しの責任能力を備えるだけで、コントローラーもビューも、余計なことを考えずにすむ。MVCはここが大事なんです。
システム連携や組織社会でも同じことが言える。
昨今の年金問題も同じこと。年金が返ってくるだけで満足?
いやいや、そのために国民が費やした時間も全額返してほしいよね?
話が飛びすぎたけどw、責任能力って、そういうことなんだと思う。
オブジェクト指向は、実社会の縮図だ。