インチキMVC

アソシエーション(hasManyなど)は、ActiveRecordの目玉だと思うが、CakePHPの実装はまだまだハンパものです。それはショウガナイとしても、サンプルコードに物申す!

今日の苦言

は、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、責任能力って、そういうことなんだと思う。
オブジェクト指向は、実社会の縮図だ。


コメント
shun
2007/07/27
興味深く拝見しています!ドキュメントに関しても Ticket を出せますので、ぜひ一度お試しを。

あと、同じことを考えている人は結構いるようです。Chris Hartjes も同じような記事を投稿していましたよ。コメント欄も盛り上がっています。

http://www.littlehart.net/atthekeyboard/2007/04/27/fat-models-skinny-controllers/
武田ソフト
2007/07/27
shunさん、初めまして。
そうですねー、喚いてないで参加しないとダメですよねw
まだCakeの何たるかや情報の集め方がわからず触っているので、いただいた情報は大変参考になりました。ありがとうございます!
匿名さん
2007/09/12
cakephp愛用者です。"Railsじゃなければ駄目だ"というのは、すごく傲慢といいますか、なんでRoRの真似でなければならないのかと不満に思います。こういう独りよがりな記事はやめてほしいと感じました。
武田ソフト
2007/09/12
そうですね。「私は場合」はRailsライクを求めてCakePHPを使おうとしたので、歪んでしまいました。しかし、このエントリを書いたことについて反省はしていません。

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: