CakePHP 再入門(1)

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

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

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

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

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

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

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

public class TopModel
{
	// 最近発売された商品
	public TNewGoods { get; set; }
	// おすすめ商品
	public TYourGoods { get; set; }
	// カテゴリ一覧
	public TCategories { get; set; }
}

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

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

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

/controllers/goods_controller.php

<?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

<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 の方には結構大変なのかなぁと思ったり。

コメントは停止中です。