CakePHPブログチュートリアルで悩んだ3つのこと

プログラム
date 2012.07.11 tag 未設定
CakePHPの勉強を始めて一週間ぐらい経ちました。バージョンは1.3.15を使ってます。
最近はCakePHPブログチュートリアルをもとにサンプルブログを作成してみました。今回のエントリーではその際につまずいた点を備忘録としてメモしておきます。

サンプルコード

今回のエントリーの対象となるコードはこちら。このコードにつまずいた点は要約されてる気がします…。

posts_controller.php

[php]
class PostsController extends AppController
{
//editアクションに限定してます。

function edit($id = null) {
$this->Post->id = $id;
if (empty($this->data)) {
$this->data = $this->Post->read();
} else {
if ($this->Post->save($this->data[‘Post’])) {
$this->flash(‘Your post has been updated.’,’/posts’);
}
}
}
}
[/php]

1. $idの謎

edit()の引数となっている$idって突如現れて悩みました。チュートリアルを完成させ、動かしてみるとURLの値をパラメータとして受け取っているんだなという推測はできるんですが仕組みはやはり分からなかったです。

マニュアルによるとCalePHPのルールということが判明。routes.php (/app/config/routes.php)というファイルにURLの仕組みが書いてあるようです。つまり今後、パラメータの受け取り方を変更したい場合などはこのファイルを編集することになります。

ちなみにデフォルトのroutes.phpの設定ではこんな感じになってるようです。

http://example.com/コントローラ名/アクション名/パラメータ1/パラメータ2/パラメータ3

この設定によってパラメータ1の値が「$this->Post->id = $id;」として受け取るようです。なるほど納得。

2. この状態でデータベースから適切な値を取得できる謎

はじめて編集画面を表示したときにはフォームにデータベースに格納された値を表示しています。この処理にはreadメソッドを使っていますが、データベースからデータを取得するときのパラメータは指定してません。どうやって取得しているか謎でした。

readメソッドの解説を引用させてもらうと… ※1

落とし穴は、自動的にid属性が設定される場合があること。

えーマジすか(TдT)じゃあ今回の場合は「 $this->Post->id = $id;」で自動的に取得するidの値を設定されていたことになりますね。分かりにくいのでread($id)とかで明示的にした方がいい気がする。

3. $this->data[‘Post’]の謎

フォームからPOST送信されたデータは「$this->params[‘form’][(name)]」のような形式で取り出せるのですが、今回のコードでは$this->data[‘Post’]という形式で取り出しています。これにも混乱してました。

フォームヘルパー機能を使用して作成したフォームから受け取るデータは「$this->data[‘Post’]」として受け取ることができます。フォームヘルパーを使わないで自分でフォームを作成する場合には「$this->params[‘form’][(name)]」で。