2006年07月11日

$this->Set()命令のミステリー

CakePHP はMVC(モデル、ビュー、コントローラ)を分離させる(つまり別々のファイルに分ける)システムです。ですから当然、モデル⇒コントローラ⇒ビューと、データを渡していく必要があります。

仕事を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'))?>
と書いてありますね……。

また今度、この辺を詳しく解説してみます。




    
posted by SDozono at 13:11| ロサンゼルス 🌁| Comment(3) | TrackBack(0) | CakePHP Controller | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
cakephp を、web上で昨日から学び始めた Bep と申します。分かりやすくてためになります。ありがとうございます^^ 「モデルをPost と命名したら、コントローラーは、モデル名に s を付加したPosts と命名する」というのが規則なのでしょうか?
Posted by 会計事務所員 at 2010年11月25日 16:39
最近、更新が滞っています。記事を見てくださり、感謝です。はい。このあたりは、Ruby on Railsから思想を受け継いでいて、「そういうことにしておけば、みんなが分かりやすいでしょ」という話になっています。“Post”というのは、「一つのPostデータ」のこと、それをメインで扱うコントローラは、「複数のPostsデータを扱うコントローラ」という意味でのネーミングです。もちろん、他のコントローラからPostモデルを使うことももちろん可能なわけで、あくまでも便宜的です。
Posted by 管理人 at 2010年11月25日 16:49
参考にさせていただきました。
CakePHP初心者の自分でも容易に理解ができました。分かりやすい記事でした。ありがとうございました。

Posted by maezono at 2011年12月29日 15:06
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/20617813
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
手(パー)To make a comment: Please type your name and comment. at the validation field box, type 'cakephp'. And there two glay buttons. "Preview"/"Submit". Thank you!