SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

CakePHPチュートリアル

CakePHPフレームワークによる快速WEB開発

生産性を向上するPHP4/PHP5用RADフレームワークの利用

  • X ポスト
  • このエントリーをはてなブックマークに追加

CakePHPの基礎知識

チュートリアル

 CakePHPに初めて触れる、という方は下記のチュートリアルを試してください。概略をつかむことができると思います。

  1. http://www.cakephp.jp/doc/blog_tutorial.html(日本語)
  2. 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」テーブルに「Comment」テーブルがぶらさがっている場合
 ちなみに、「User」テーブルに「Comment」テーブルがぶらさがっている場合は、モデル内で、
User hasMany Comment
Comment belongsTo User
 と設定してあれば、$usesを指定しなくても、次の記述で対応できます。
  $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なら、

  1. 「cake」フォルダ内のapp_model.phpを「app」フォルダにコピー
  2. 「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);
        }
    }

}

 とすると、すべてのモデルに対して文字コードの指定がかかるようになります。認証なども同じ理屈で実装できます。

 CakePHP 1.2系からはDBの設定時に文字コードを指定できるようになります。

 なお、モデル(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で指定した最初のパラメータが、ビューの中では変数名になることに注意してください。

次のページ
bake.phpスクリプトを活用しよう!

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
CakePHPチュートリアル連載記事一覧
この記事の著者

堂園 俊郎(ドウゾノ シュンロウ)

(株)コミュニケーション・ビジネス・アヴェニュー技術担当。著書「CakePHPガイドブック」。CentOSサーバによる大小のコールセンター立ち上げ業務のかたわら、オープンソースプロダクトのコンサルティングを行う日々。http://cakephp.jpの管理人。ブログ:「CakePHPのおいしい食べ方」http://cakephp.seesaa.net 、「trixbox/asterisk技術者の365/a VoIP engineer in Japan」http://douzo.seesaa.net など。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/670 2007/12/13 16:06

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング