CakePHP 再入門(1)

ASP.NET MVC の連載記事の関係から、他の MVC ものも抑えておかないと、と言いますか、CakePHP は抑えないと今日びの WEB ものはできないですよね~。かどうかは分かりませんが…

おととし CakePHP 祭りに行った頃から注目はしていたのですが、最初のチュートリアルをした後で止まっておりました。MVC 自体は色々と興味があるところなのですが、果たして PHP で実装をする側に立つことが今までなかったもので。

さて、ASP.NET MVC の場合は Model は、LINQ to Entities やら独自の Model やらを選べます。と言うのも、ひとつの画面にひとつのテーブルだけが表示される、ってことはほとんどないんですよね。

例えば、Amazon のトップページを例にとれば、

  • 最近発売された商品の一覧
  • あなたにおすすめの商品の一覧
  • カテゴリ一覧

な感じで、いくつかのテーブルから検索結果を出します。

このようにする場合は、ASP.NET MVC の Model の場合には、

1
2
3
4
5
6
7
8
9
public class TopModel
{
    // 最近発売された商品
    public TNewGoods { get; set; }
    // おすすめ商品
    public TYourGoods { get; set; }
    // カテゴリ一覧
    public TCategories { get; set; }
}

な感じで、3 つのテーブルを内部に持つ必要があるわけです。

これって、CakePHP でできるんだっけ? ってのが、いままでの私の疑問でありました。
CakePHP の Model って、ひとつのテーブルがバインドされている、という固定観念があったわけですね。

が、違います。当たり前だったのですが、CakePHP でも、複数のテーブルをモデルの含めることができます。モデルというか、コントローラーから複数のモデルをビューへ渡すことができます。

/controllers/goods_controller.php

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class GoodsController extends AppController {
    var $name = 'Goods';
    var $uses = array('NewGood','YourGood','Category');
 
    function index() {
        $this->set('NewGoods', $this->NewGood->find('all'));
        $this->set('YourGoods', $this->YourGood->find('all'));
        $this->set('Categories',$this->Category->find('all'));
    }
}
?>

のように作成しておくと、

http://servername/goods

で次のような画面が表示できます

この時のビューは次な感じ。
/views/goods/index.ctp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<h1>NewGoods</h1>
<table>
    <tr>
        <th>Id</th>
        <th>name</th>
        <th>price</th>
    </tr>
</p>
<p>
<?php foreach ($NewGoods as $item): ?>
    <tr>
        <td><?php echo $item['NewGood']['id']; ?></td>
        <td><?php echo $item['NewGood']['name']; ?></td>
        <td><?php echo $item['NewGood']['price']; ?></td>
    </tr>
<?php endforeach; ?>
</table>
</p>
<p>
<hr/>
<h1>YourGoods</h1>
</p>
<p>
<table>
    <tr>
        <th>Id</th>
        <th>name</th>
    </tr>
</p>
<p>
<?php foreach ($YourGoods as $item): ?>
    <tr>
        <td><?php echo $item['YourGood']['id']; ?></td>
        <td><?php echo $item['YourGood']['name']; ?></td>
    </tr>
<?php endforeach; ?>
</table>
<hr/>
</p>
<p>
<h1>Categories</h1>
<table>
    <tr>
        <th>Id</th>
        <th>name</th>
    </tr>
</p>
<p>
<?php foreach ($Categories as $item): ?>
    <tr>
        <td><?php echo $item['Category']['id']; ?></td>
        <td><?php echo $item['Category']['name']; ?></td>
    </tr>
<?php endforeach; ?>
</table>

複数の Model(NewGoods,YourGoods,Categories)を、コントローラー GoodsController でひとまとめにして、ビューで表示させるという方式です。

ASP.NET MVC の場合は、View に対してひとつの Model しか引き渡せないので、このあたりの動きが違います。逆に言えば、CakePHP の場合は、ひとつの Model にひとつのテーブル(あるいは複数のテーブルのクエリ結果)を渡すことになるので、このあたりが「違い」ますね。

カテゴリー: 雑談, CakePHP パーマリンク

CakePHP 再入門(1) への2件のフィードバック

  1. konica のコメント:

    こちらも丁度、
    学んでいて感謝(´・ω・)ス

    ちとzendと悩むけど(´・ω・)ゞ

  2. masuda のコメント:

    私のほうは zend を知らないので、CakePHP 張りでw
    smarty とか、その他諸々の PHP の方には結構大変なのかなぁと思ったり。

コメントは停止中です。