CakePHPの基礎知識
チュートリアル
CakePHPに初めて触れる、という方は下記のチュートリアルを試してください。概略をつかむことができると思います。
- http://www.cakephp.jp/doc/blog_tutorial.html(日本語)
- http://manual.cakephp.org/appendix/blog_tutorial(英文オリジナル)
MVCの分け方
CakePHPでは、MVCそれぞれに一つずつのファイルが対応しています。ディレクトリの名前を見れば、それぞれのファイルがどこに入っているのか、直感的に判断できるはずです。
DBに「users」テーブルがある場合
分類 | ファイル名 | 備考 |
モデル(Model) | app/models/user.php | クラス名はUser |
ビュー(View) | app/views/usersフォルダ内 | ファイル名は、メソッド.thtml |
コントローラ(Controller) | app/controllers/users_controller.php | クラス名はUsersController |
CakePHPでは、「Modelは、DBの一つのテーブルと対応する」というルールを決めて、簡略化しています。テーブル名は複数形で付け、idというprimary,auto_incrementのフィールドを用意してください(既存のDBテーブルがあり、既に複数形ではない形での名称が付いている場合には、$useTable
という変数を任意に指定することで対応可能です)。コントローラから複数のモデルを利用したい場合には、コントローラの最初に、
var $uses = array('User','Comment','その他のクラス'……);
と設定しておけば、
$user_data = $this->User->read(null, $id); $comment_all = $this->Comment->findAll();
などのように同一コントローラ内で複数のモデルを利用できるようになります。
User hasMany Comment Comment belongsTo User
$comment_all = $this->User->Comment->findAll();
urlの指定の仕方
指定されたURLに対応するファイルが存在しない場合、Cakeは自分への指令だと考えて処理を実行します。形式は、次の形式になります。
http://Cakeのパス/コントローラ名/アクション名/パラメータ1/パラメータ2/……
例1:
例えば、次のように記述すると、
http://cake/users/edit/4
usersコントローラのedit
メソッドをパラメータ4で実行する、という意味になります。続いて、
http://cake/items/view/4/6
は、itemsコントローラのview
メソッドをパラメータ4と6で実行する、という意味になります。
CakePHPフレームワークのファイルと、プロジェクト用ファイルは別フォルダに分かれている
親となる基本クラス群は、「cake」フォルダの中に入っています。このクラスにメソッドを追加・修正したい場合には、対応する「app」フォルダの同じ位置にコピーしてからそれを修正すれば、CakePHPが自動的に識別してそちらが実行されるようになります。一例として、CakePHPで「すべてのモデルに対して同じ動作をさせたい」場合には、親クラスであるapp_model.php
に、その命令を書いておくと、その性質がすべての子モデルに受け継がれます。
例:2
MySQL 4.1以降は、接続後に「SET NAMES 文字コード」を発行すると、 Windowsのコンパイル済みMySQLでも日本語が文字化けしません。テーブルのコードがujisなら、
- 「cake」フォルダ内の
app_model.php
を「app」フォルダにコピー - 「app」フォルダにコピーした
app_model.php
に下記のコードを追加
class AppModel extends Model{ function __construct() { parent::__construct(); if(!defined('GLOBAL_UJIS')) { $this->query('SET NAMES UJIS'); define('GLOBAL_UJIS', TRUE); } } }
とすると、すべてのモデルに対して文字コードの指定がかかるようになります。認証なども同じ理屈で実装できます。
なお、モデル(Model)にはコールバック関数として、次の関数が準備されています。
beforeFind()
afterFind()
beforeDelete()
afterDelete()
beforeSave()
afterSave()
beforeValidate()
それぞれの動作時点に命令を書けるようになっています。また、コントローラ(Controller)には、次の関数があります。
beforeFilter()
afterFilter()
beforeRender()
コンポーネント、ヘルパーにもそれぞれコールバックがあります。使い方の詳細はマニュアルを参照してください。
データは配列として取り出せる
CakePHPは、PHPの特徴とも言える配列を縦横無尽に利用しています。よく分からなくなったら、var_dump()
やprint_r()
などの関数を使うことで、中身を知ることができます。
例:3
情報入力フォームに下記の項目があるとします。
【名前:】<?PHP echo $html->input('User/name', array ('size' => '40') ?> 【年齢:】<?PHP echo $html->input('User/age', array ('size' => '20') ?>
と書いておくと、実際のWebページ上には、次のように展開されます。
<input name="data[User][name]" size="40" value="" type="text" id="UserName" /> <input name="data[User][age]" size="20" value="" type="text" id="UserAge" />
このデータが入力され、送信されると、値のチェックなどが終わったコントローラの$this->data
の中には、
Array ( [User] => Array ( [name] => Yamada Taro [age] => 30 ) )
という形でデータが入ってきます。コントローラ内で、
$this->User->save($this->data)
とすると、 これは「$this->data
に入ってきた情報に基づいて、User
クラス(「users」テーブル)でデータを保存しなさい」としたことになります。
ですので、名前の付け方でDBとフィールドを指定し、わずか1行ですべての情報を格納できます。
コントローラからビューへのデータの渡し方
コントローラの中には、ビューへデータを渡すためのset()
という関数が用意されています。変数でも配列でもセットできるので、上手に利用しましょう。
例:4 コントローラ内
$this->set('nanika', $nanika_no_data);
とすると、
ビュー内では、
<?php echo $nanika; ?>
で表示させることができます。set
で指定した最初のパラメータが、ビューの中では変数名になることに注意してください。