CakePHP入門 ITかあさん

ITかあさん

目次:CakePHP入門

Cakephpとは人気のフレームワークの一つです。
SQLを書かなくても、何と10分足らずでプログラムが作れちゃいます!
そんな大人気のCakephpの入門をまとめました。
この記事の通りに進めていくと、オリジナルのデザインリンク集を作ることが可能です。
ぜひこの記事を通してCakephpの魅力を存分に知ってくださいね!

cakephpでブックマークアプリを作る(2)

前回までの内容で、cakephpを利用して、データベースの内容を表示するところまではできました。ブックマークアプリらしく、さらにはよくありがちな『WEBデザインのリンク集』なんかにも応用できるようになるよう、登録したURLをカテゴリ別けして、カテゴリごとに表示できるようにしてみましょう。

カテゴリー用のフィールドを追加する

ALTER TABLE `posts` ADD `category` INT NULL AFTER `url` ,
ADD INDEX ( `category` ) 

URLをカテゴリごとに振り分けするフィールドを用意します。INT型にしてINDEXも設定するといいでしょう。

データを追加する

まだデータ数が2件しかないので、表示用のデータを追加しましょう。
さきほどカテゴリーも追加しましたが、このcategoryフィールドのルールは

  • 1→検索エンジン、ポータルサイト
  • 2→ブログ

とでもしておきましょうか

INSERT INTO `bookmark`.`posts` (
`id` ,
`title` ,
`url` ,
`category` ,
`created` ,
`modified`
)
VALUES (
NULL , 'コリス', 'http://coliss.com/', '1', '2011-02-23 13:21:33', NULL
), (
NULL , 'CREAMU', 'http://blog.creamu.com/mt/', '1', '2011-02-23 13:23:36', NULL
), (
NULL , 'ITかあさん', 'http://www.kaasan.info/', '1', '2011-02-23 13:23:50', NULL
);

(強制はしませんが、ITかあさんも追加してくれると嬉しいです。)

前回までに登録したデータのcategoryフィールドはまだNULLなので、カテゴリのデータを追加してあげてください。

UPDATE `bookmark`.`posts` SET `category` = '0' WHERE `posts`.`id` =1 LIMIT 1 ;

UPDATE `bookmark`.`posts` SET `category` = '0' WHERE `posts`.`id` =2 LIMIT 1 ;

なぜ`category` = ‘0’ と、1からではなく、0から始まっているかというと、Cakephpのフォームヘルパーで仮にプルダウンを作ると、
デフォルトでは0から始まるからなのです。ま、当面なんでもデフォルトでいきましょう。

これで今回の内容に必要なデータが揃いました。

category = 0だけを出力する

今回の覚える内容はcakephpのconditionsの話です。conditionsを設定すると、前回はデータベースに登録してある内容をすべて表示しましたが、条件を絞ってデータを表示する、というものです。SQLで言う、WHEREにあたる部分です。

PostsController

<?php
class PostsController extends AppController {

var $uses = array('Post');//自分が使うmodelを配列で書きます。今回はひとつだけ

function index($id = null) {

$con = array('conditions'=>
array('Post.category'=>1)
);

$post = $this->Post->find('all',$con);

debug($post);

$this->set('posts',$post);//SmartyのAssignと同じ。viewに出力用の変数として渡します
}

}

?>

追加・変更になったのは赤字の部分だけ。すると、debug($post);の結果が変わりましたね

Array
(
    [0] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => Yahoo
                    [url] => http://www.yahoo.co.jp
                    [category] => 0
                    [created] => 2011-02-18 14:34:44
                    [modified] => 
                )

        )

    [1] => Array
        (
            [Post] => Array
                (
                    [id] => 2
                    [title] => Google
                    [url] => http://www.google.co.jp/
                     [category] => 0
                    [created] => 2011-02-18 14:35:11
                    [modified] => 
                )

        )

)

[category] => 0
の条件のものだけが無事出力されましたね。
この conditionsには色々ありまして、例えばOR検索、AND検索、LIKE検索も条件が複合検索になっても当然OKです。

順番を入れ替えてみる

CakephpでWHEREができるということは、ORDER BYもできるんです。とっても簡単!

PostsController

<?php
class PostsController extends AppController {

var $uses = array('Post');

function index($id = null) {

$con = array('conditions'=>
array('Post.category'=>1)
'order' => array('Post.id DESC'),
);

$post = $this->Post->find('all',$con);

debug($post);

$this->set('posts',$post);
}

}

?>

これだけで降順になりました!簡単!WHEREと同様に複合的に順番を入れかえることもできます。

今日の分は、前回の続きなので、PostsControllerのファイルだけをあげておきますね。
ダウンロードはこちら

次回はこのカテゴリをページごとに別けたいと思います。

今日のまとめ

$conditions = array(‘conditions’=>array(‘Post.category’ =>1),
‘order’ => array(‘Post.id DESC’),
);
これで条件も、ソートもばっちり!
どうでもいいですが、私の文章や記事が明らかにCakephpの初めての記事からだいぶ『エラソー』になったのにお気づきでしょうか?
Cakephpが楽しすぎて、Cakephp初めて1ヶ月で会員サイト、携帯サイトの構築ができてしまったんです!エヘヘ。

cakephpでブックマークアプリを作る(1)

最小のMVCをつくる

Mはmodel(データベース),Vはview(HTMLや見た目の部分),Cはcontrollers(プログラムの制御を行う)でcakephpは構成されています。

modelを作成する

データベースにて、postsテーブルを作成しましたので、/app/models/フォルダの中に
post.phpというファイルを作成して、以下の記述をします。

php4ならこの記述

<?php
class Post extends AppModel
{
var $name = 'Post';//PHP4のときは書く
}
?>

php5以降ならこの記述

<?php
class Post extends AppModel
{
}
?>

class Post extends AppModel
class Post extends AppModelでは、postが単数形であることに注意してください。単数系であることだけ注意していただければ、特にこれと言って説明もありません。

controllersの作成

次にコントローラーを作成します。今回postというテーブルを使うことにしたので、/app/controllors/に新しくposts_controller.phpというファイルを作成して、以下の記述をします

<?php
  class PostsController extends AppController {
}
  ?>

posts_controller postsが複数系であることに注意してください。
モデル(データベース)は単数形、コントローラーは複数形といった感じでしょうか?

まだposts_controllerの中身は空ですが、ここでいったん、アクセスしてみたいと思います。
(途中からで申し訳ないのですが、ローカル環境にしてしまいました。)
ローカルのbookmarkフォルダで作って、postsコントローラーで作っているので、
URLは以下の通りになります。

http://localhost/bookmark/posts/

とりあえず怒られました。

cakephpには、コントローラーがあれば、必ずそれを出力するview(HTMLとかコントローラーの内容を出力するほう)が必要になります。

エラーが気になるのでとりあえず先にposts_controller.phpを出力するファイルを作成しておきます。
C:\xampp\htdocs\bookmark\app\views

コントローラー名がposts_controller.phpとしているので、viewフォルダに新しくpostsフォルダを作成して、その中にindex.ctpというファイルを作成します。viewの拡張子は.ctpとなっていることに注意してください。

C:\xampp\htdocs\bookmark\app\views\posts\view.ctp

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Bookmarkアプリ ブックマーク出力画面</title>
</head>

<body>
<h1>Bookmarkアプリ ブックマーク出力画面</h1>

<table>
<tr>
<th>サイト名</th>
<td>URL</td>
<td>登録日時</td>
<td>更新日時</td>
</tr>
</table>

</body>
</html>

うん、見るからに普通のHTMLファイルですね。WEBデザイナーの方なんかは、なんら気にする点はないと思います。

まずは一覧表示用のコントローラーを作成していきます。
{}の中にトップページ表示用の記述を追加します。

class PostsController extends AppController {
function index($id = null) {
$post = $this->Post->find('all');
debug($post);
}
}
}

これで一旦出力してみましょう。すると、

Array
(
    [0] => Array
        (
            [Post] => Array
                (
                    [id] => 1
                    [title] => Yahoo
                    [url] => http://www.yahoo.co.jp
                    [created] => 2011-02-18 14:34:44
                    [modified] => 
                )

        )

    [1] => Array
        (
            [Post] => Array
                (
                    [id] => 2
                    [title] => Google
                    [url] => http://www.google.co.jp/
                    [created] => 2011-02-18 14:35:11
                    [modified] => 
                )

        )

)

データベースの中身が連想配列で表示されました。debug()とは、cakePHPのコントローラー内で変数の中身を自由に参照するためのものです。文字列だろうが、配列だろうがどちらでもdebug()でいけます。便利ですね。

無事データベースの中身が参照できたところで、出力ファイル用に変数に代入してあげます。Smartyで言うところのsmarty assignのようなものです。function index($id = null){}の中に$this->set(‘post’,$post);と書いてあげるだけです

class PostsController extends AppController {
function index($id = null) {

$post = $this->Post->find('all');
debug($post);
$this->set('post',$post); }

}
}

長くなりましたが、あともう少し。先ほどのviewフォルダのindex.ctpを変更します

<table>
<tr>
<th>サイト名</th>
<td>URL</td>
<td>登録日時</td>
<td>更新日時</td>
</tr>
<tr>
<?php foreach ($posts as $post ): ?>
<th><?php echo $post['Post']['title'];?></th>
<td><?php echo $post['Post']['url'];?></td>
<td><?php echo $post['Post']['created'];?></td>
<td><?php echo $post['Post']['modified'];?></td>
</tr>
<?php endforeach; ?>
</table>

赤字の書き方でctpファイル内でのforeachになります。Smartyとそっくりです。

<table>
<tr>
<th>サイト名</th>
<td>URL</td>
<td>登録日時</td>
<td>更新日時</td>
</tr>
<tr>
<?php foreach ($posts as $post ): ?>
<th><?php echo $post['Post']['title'];?></th>
<td><?php echo $post['Post']['url'];?></td>;
<td><?php echo $post['Post']['created'];?></td>
<td><?php echo $post['Post']['modified'];?></td>
</tr>
<?php endforeach; ?>
</table>

<th><?php echo $post[‘Post’][‘title’];?></th>に注目してください。[‘Post’]と、model名が来ていますね!Postモデルのtitleというフィールドを出力しますよという意味になります。

長くなりましたが、以上で、一覧表示については終わります。

次回はORDER BYやWHEREのデータの条件の絞込みについてやります。

今回の内容は圧縮してこちらにおきました。
細かくコメントアウトでより詳しく解説してありますので、よろしかったらダウンロードしてください。
ダウンロードはこちら

今日のまとめ

・model→単数形
・controllers→複数形
・データベースのtable→複数形
・データを表示するにはcontrollerとそれに対応するviewが必要
・$post = $this->Post->find(‘all’);データは連想配列で受け取る

CakePHP  security saltとデバッグモードの設定

CakePHPでコントローラーを作る前にやること、確認することが2点あります。
それはsecurity saltの変更とデバッグモードの確認です。

デバッグモードの変更

/app/config/core.php の52行目に
define('DEBUG', 2);と書いてあるやつです。

ざっと説明しますと、

  • 0: エラーは出力されず、デバッグメッセージ表示されない。
  • 1: Warnings とエラー、デバッグメッセージを表示。
  • 2: 実行されたSQL 文が表示。
  • 3:2の内容と、現在のオブジェクトのフルダンプも表示

一通り開発が終わったらエラーやダンプを表示させないよう、最後は
define('DEBUG', 0);
とします。

ひとまず、私はdefine('DEBUG', 2);
これでいこうと思います。CakePHP1.3をダウンロードするとデフォルトは2になっていますけどね。

security saltの変更

ハッシュの生成に用いられているようです。マニュアルにそう書いてあった。
/app/config/core.phpの153行目を編集し、デフォルトのsalt値を変更します。
デフォルトから1文字でも修正してあればいいそうです。

例えばローカルの開発環境から本番のサーバーにまるごと移動した場合、このsecurity saltの変更を求めてエラーが出力されます。
サーバーを移動したらsecurity saltも一緒に変更してあげます。

これでCakePHPの開発環境が整いました!

CAKEPHP データベースの設計

動画をもっと大きく見たい方はこちら

CakePHPの便利なところは

  • 面倒な処理(SQLはCakePHP側で勝手にやってくれる)
  • データベースの種類に依存しない

これに限ると思います。

これらの便利な機能を存分に発揮するにはCakePHPに沿ったデータベースの設計が必要です。

CakePHPのデータベース設計のコツ

  • フィールドの型は命名規則を守る

CakePHPの機能を存分に使うためにはCakePHP独自の命名規則を守らなければなりません。

今回は簡易的なブックマークアプリを作成します。

データベースの内容

  • ID
  • タイトル
  • URL
  • 登録日時
  • 更新日時

SQL

CREATE TABLE posts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
url VARCHAR(50),
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);

まずテーブル名ですが、これにも大事な規則があり、仮にpostという内容のテーブルを作成したいなら、postsと、必ず複数形にします。

id名はpost_idとか余計なことはせず、ただidと書きます。で、

URLとタイトルについては特に変わらずいつものデータベース設計と一緒。

登録日時と更新日時の登録については重要な命名規則があります。

登録日時はcreated,更新日時はmodified

登録日時や更新日時をデータベースに登録するにはPHP側でdate関数を使って取得しなくてもCakePHPが勝手にやってくれます!すばらしか!

登録日時と更新日時がほしい場合は登録日時はcreated,更新日時はmodifiedというフィールド名を作成し、DATETIME型にする。これだけです。

なお、今回は多数の書き込みを予想してデータベースの種類はMysqlのinnoDBにしました。私もまだデータベースについてはまだ初心者ですが、SELECT文についてはMyisamが早く、トランザクション機能とサブクエリが投げられるのがnnoDB。それぞれの特徴をつかんで使い分けるとよさげです。

今日のまとめ

テーブル名は複数系。オートインクリメントはid、登録日時はcreated,更新日時はmodifiedとそれぞれCakePHPの命名規則に沿って名前をつけること!

CakePHP データベース接続

まずは開発用のテーブルを作成します。

まずPHPmyadminより、テーブル作成しました。
CakePHPで初めてのDB操作なので、最小限に留めました。
ちなみにMySQL の文字コードは UTF-8 Unicodeです。

CREATE TABLE `facilities` (
`f_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(150) DEFAULT NULL,
`url` varchar(100) DEFAULT NULL,
PRIMARY KEY (`f_id`)
)

データベース作成後、サンプル表示用にデータを入力します。

CakePHP データベース利用の基本

データベース定義ファイルの作成

CakePHPでは データベースに関する情報(データベースの種類、ユーザー名、パスワード)をappフォルダの中のconfigフォルダに置くそうです。 

CakePHPをインストールした時に、app/config/ディレクトリ内にdatabase.php.defaultというファイルがあります。 

CakePHP データベース利用の基本

ファイル名をdatabase.phpと変更して、このファイルの下にデータベースに関する情報を入れるところがありますので、各自変更してあげるようです。


class DATABASE_CONFIG {

	var $default = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'database_name',
		'prefix' => '',
	);

	var $test = array(
		'driver' => 'mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'user',
		'password' => 'password',
		'database' => 'test_database_name',
		'prefix' => '',
	);
}

$test…というのは、テスト用のデータベースの設定なので、上の$defaultだけ設定すればいいそうです。
今回は一番ユーザーの多いMysqlを元に進めていきますので、変更するところは
・’login’ => ‘user’,
・’password’ => ‘password’,
・’database’ => ‘database_name’,
この3つだけです。各自環境にあわせて変更してください。
変更したら、さきほどのフォルダに再びアップロードします。(私は念のため、database.php.defaultは残しておきました。)
CakePHP データベース利用の基本

データベースへの接続チェック

database.phpをconfigフォルダにアップしたら、さっそくWEBページにアクセスしてみます。…どうでしょうか?
一見すると表示に変化はほとんどありませんが、ページ中間に、Cake is able to connect to the database.の記述が出れば接続成功です。
CakePHP データベース利用の基本

CakePHP インストール

CakePHPを本家サイトからダウンロードすることから始めていきましょう!

CakePHPのインストール

CakePHPのインストールは非常に簡単です。公開用のディレクトリにダウンロードしたCakePHPをフォルダごとまとめてアップするだけ。簡単ですね。

まずはCakePHPの公式サイトに行って、ダウンロードボタンをクリックします。

CakePHPのインストール

ダウンロードページに行くと、CakePHPのバージョン一覧が出てくる。

ここで注意したいのが、CakePHP 1.3.0-betaのように、数字の後ろに何か付いているものは安定版じゃないそうなので、それ以外のものをダウンロードするとよい。注意するのはそれだけ。私は1.3.5をダウンロードしました。

これがダウンロードした中身。後はこのフォルダの中身を公開ディレクトリにアップロードするだけ

で、アップしたディレクトリに対してブラウザでアクセスしてみます。

すると最上部に早速エラーが出ててきました。

出力されたエラーは以下

Warning (512): /home/sites/webmin/web/kodomo119/app/tmp/cache/ is not writable [CORE/cake/libs/cache/file.php, line 267]

Warning (512): /home/sites/webmin/web/kodomo119/app/tmp/cache/persistent/ is not writable [CORE/cake/libs/cache/file.php, line 267]

Warning (512): /home/sites/webmin/web/kodomo119/app/tmp/cache/models/ is not writable [CORE/cake/libs/cache/file.php, line 267]

is not writableというのは、書き込み権限に対するエラーですね。

/app/tmp/cache/って書いてあるので、ここのフォルダに書き込み権限が無いといっているわけですね。FFFTPやWinSCPを使って、パーミッションの変更を行います

同様にエラーの出ていた

/home/sites/webmin/web/kodomo119/app/tmp/cache/persistent/

/home/sites/webmin/web/kodomo119/app/tmp/cache/models/

この2つのディレクトリに対してもパーミッション『777』にしてあげたところ、エラーは無事でなくなりましたとさ!

インストールした先はこちら。

動画で今回の内容をまとめました

もっと大きくしてみたい方はこちらからどうぞ!

この本使ってます

先日会社で『フレームワークの本一冊購入したい』と言って、買ってきました。基礎からCakePHPについて説明してくれています。ある一定のPHP+Mysqlのサイト作成経験があればすんなり入っていけます。非常に読み進めやすく、いかにCakePHPが楽しいかを解説してくれていて読んでいて『早くCakePHPでサイト構築したい!』という気持ちになれます