2006年07月07日

Blogチュートリでつまづいたら

CakePHP のサイトに行ったら、まずは Blogの作り方、というチュートリアルを見ると思います。
http://wiki.cakephp.org/tutorials:blog_tutorial_-_1

※注:現在は、http://manual.cakephp.org/chapter/20 が最新版のようです。※

しかし、この記事、「マジックを見せるけど、たねあかしはしない」ようなところがあるので、「こんなに簡単に作成できるのか〜」と思わせるのと同時に、「どうしてこう動くようになるのか、よく分からなかった」と感じてしまう人も多いようです。

例えば、最初の部分で、モデルを作るには、

class Post extends AppModel
{
  var $name = 'Post';
}


とすればよいとあります。これを見て、「クラスを作ったのに、中身が変数一個なんておかしい」と思う人も結構いるわけです。
実は、「実際のプログラムでは、ここにどんどん自分のコードを追加してゆくことになる」んですが、何も追加しなくても、「既に機能が追加されているので、ある程度のことはできてしまう」というのが事実です。

"extends AppModel"というのがミソで、AppModel という基本クラスの持っている性質をすべて受け継いでいます。
ですから、すでに下記のような関数が使えるようになっています。
(Model に関するAPIの解説は、http://api.cakephp.org/class_model.html にあります。)

$this->Post->findAll(...); //すべてのデータを取得
$this->Post->find(...); //条件で検索
$this->Post->findAllByフィールド名(..); // 例えば、name というデータベースフィールドであれば、 $this->findAllByName('山・太郎'); で検索できる。
$this->Post->findNeighbours(...); // その条件のお隣さんを見つけてくる(次へ>などの表村用)
$this->Post->field(...); //あるフィールドの情報だけを取得
$this->Post->findCount(...); //件数を取得
$this->Post->generateList(...); //検索データを配列で受け取る
$this->Post->read(...); //あるIDのデータをフィールド情報+データで受け取る

などなどがあります。これだけでも結構なことができてしまいますね。
でも、自分の欲しいメソッドを作成したり、バリデーション(データが正しくなければ警告する・保存するためのルール)を追加したりしたい場合には、Post クラスの中にいろいろと書き込むことになります。

例えば、


class Post extends AppModel
{
  var $name = 'Post';

  function mymethod(){
   //ここに自分の扱いたい内容
  }
}

とすれば、 $this->Post->mymethod() という関数の誕生です。

ブログチュートリアルでもう一つ説明がないのは、コントローラのメソッドに対して、$id がどこからやってくるか、という説明です。
例えば、app/controllers/posts_controller.php にこう書けとあります。

class PostsController extends AppController
{
  function view($id)
  {
    $this->Post->id = $id;
    $this->set( 'data', $this->Post->read() );
  }
}

ここで、なぜか $id という変数がどこからともなく現れているのですが、これはどうなっているんでしょうか。
これを知るには、CakePHP の mod_url の使い方を学ぶことが必要です。
簡単に説明すると、URLは次のようなルールで指定します。

http:// Cakeのパス/コントローラ名/アクション名/変数1/変数2/変数3/...

もし、「該当するURLで村されるファイルが存在しない(=Cakeへの指令だ!)」という時には、CakePHP が自動的にコントローラの該当する指令に振り分け、変数をはめこんで実行する、という流れになります。ですから、

http:// cakeのパス/samples/save/1/2/3/4

とした場合、CakePHP は、「sample コントローラーの save メソッドを実行します。データとしては、1,2,3,4を入れます」
ということになります。

それを

class SamplesController extends AppController
{
  function save($id1,$id2,$id3,$id4)
  {
    echo "このメソッドが実行されます!データは、".$id1."と".$id2."と".$id3."と".$id4."です。";

  }
}

などのようにして、コントローラは受けることができます。
こんな説明でいかがでしょうか。少し分かりやすくなったでしょうか……?
次回は、set 命令の秘密に迫ってみたいと思います。
posted by SDozono at 13:07| ロサンゼルス ☀| Comment(1) | TrackBack(0) | CakePHP Model | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
blog チュートリアルは、
中途半端に知識だけがある者(含む僕)が見ると
なんで?みたいなところがあって苦悶でした^^;

咀嚼していただき、感謝します!
Posted by はなおか at 2007年05月25日 20:53
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

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


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
手(パー)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!