仕事を3人で分けたら、必ずそこにコミュニケーションが発生するのと同じです。この3者をつなぐ電話のようなものは何でしょうか。
1)モデルからコントローラへは?
チュートリアルなどにもかかれていますが、コントローラがモデルの情報を知りたい場合には、
class PostsController extends AppController
{
この中で、
$result = $this->Post->findAll();
などのようにして、Postモデルの情報を受け取ることができます。
}
2)コントローラからビューには?
ここで登場するのは、
$this->set('変数名', データ); という構文です。コントローラでこれを設定すると、ビューの中でデータが取り出せます。
注意してほしいのは、
$this->set('nanika', "これはデータです。"); などのようにすると、
ビューからは、
echo $nanika;
として取れるということです。つまり、「set命令でデータをセットすると、ビューの中では変数の名前になる」ということです。また、変数でも配列でも何でも渡すことができます。
Cやその他の言語では、この「データが変数に化ける」という使い方はあまりしないと思うので、最初、戸惑うところかもしれません。また、PHPらしいところをうまく使っていると言っていいかもしれません。CakePHPにはキャッシュの機能もありますので、これと組み合わせると、Smarty などの外部のテンプレートシステムを使用する必要がないほどです。
内部的にはどうやって実現しているかというと、view.php の中に、
extract($___dataForView, EXTR_SKIP);
という文があります。ここでデータを変数に展開しています。
そういえば Ruby には extract に似た関数があるのかな、と思い調査したところ、そんなに簡単ではなさそう?でした。
http://www.html.com/forums/ruby/48892-extract-hash-into-local-variables.html
Ruby の方、Rails では、このあたりがどんな具合になっているんでしょうか……?
*追記*
3)ビュー(送信フォーム)からコントローラには?
これはちょっとヒントだけ書いておきます。考えてみてください。
マニュアルのブログ・チュートリアルを見ると、
function add()
{
if (!empty($this->data))
{
if ($this->Post->save($this->data))
{
$this->flash('Your post has been saved.','/posts');
}
}
}
とあります。 $this->data の中にデータが入っている場合には、データベースに登録する、ということは……。また、フォーム(ビュー)のほうでは、
<?php echo $html->input('Post/title', array('size' => '40'))?>
と書いてありますね……。
また今度、この辺を詳しく解説してみます。