読者です 読者をやめる 読者になる 読者になる

one's way blog

ワクワクを生み出せるWebエンジニアを目指して。

【47:CakePHP 2.x】フレームワークを使ってブログアプリケーションを作る

f:id:seintoseiya:20160110211740j:plain
プロジェクトNo.47:CakePHP 2.x - DEMO

フレームワークを覚えることで、少ないコード量で、複雑なアプリケーションを作ることができます。
今回はPHP開発で有名なCakePHPフレームワークを使ってみたいと思います。

環境

ローカル開発環境は以下のとおりです

ダウンロード

最新版は3.xが出ていますが、今回は2.7.5を使用します。
Tags · cakephp/cakephp · GitHub

※最新版も後日、挑戦予定。
http://onesway.hatenablog.com/entry/cakephp3

作るもの

ブログの投稿記事の一覧表示 (list)、追加 (add)、 編集 (edit)、削除 (delete) などができるブログアプリケーションを作っていきます。
公式のチュートリアルにも入門としてブログアプリケーションの作成手順が載っています。
入門 — CakePHP Cookbook 2.x ドキュメント

完成したものはこちら

MVCデザインパターン

CakePHPではMVCデザインパターンを採用しており、その考え方を理解する必要が有ります。
こちらに簡潔に説明してあります。
MVC(Model-View-Controller)を理解する — CakePHP Cookbook 2.x ドキュメント
要は、開発部品を3つの層に分けて、開発及び保守しやすくするといった考え方です。
ちょー簡単に説明すると、
Model(M)層はデータベースとのやりとりをする部分、
View(V)層は画面描画する部分、
Controller(C)層はユーザからのリクエストを受け取り、モデル層とビュー層に指示を出すロジック部分
の様な理解で良いかと思います。

CakePHPのディレクトリ構造

基本的にはModel, View, Controllerディレクトリにそれぞれのファイルを置いていけばOKです。
パスやデバックモードのON/OFFの設定などはconfigの内容を編集することでできます。
f:id:seintoseiya:20160110211533p:plain

開発手順

ここでは大まかな手順のみご紹介します。
詳細手順は参考サイトなどをご参照下さい。

Tmp ディレクトリのパーミッションを変更

Webサーバを動作させているユーザーに対してTmp ディレクトリのパーミッションを書き込み可能にします。

データベースの準備

ブログの投稿内容を記録するデータベースを作成します。
postsというテーブルを作成しておきます。ついでにデータも挿入。

create table posts (
  id int not null auto_increment primary key,
  title varchar(50),
  body text,
  created datetime default null,
  modified datetime default null
);

insert into posts (title, body, created, modified) values
  ('title 1', 'body 1', now(), now()),
  ('title 2', 'body 2', now(), now()),
  ('title 3', 'body 3', now(), now());

データベース設定ファイルの編集

/app/Config/database.phpの内容を変更します。

public $default = array(
	'datasource' => 'Database/Mysql',
	'persistent' => false,
	'host' => '****',
	'login' => '****',
	'password' => '****',
	'database' => '****',
	'prefix' => '',
	//'encoding' => 'utf8',
);

ここまで完了したらルートにアクセスして、データベースのエラーがなければOKです。

セキュリティ設定ファイルの編集

/app/Config/database.phpのSecurity.salt と Security.cipherSeedの値を変更します。
Security.salt と Security.cipherSeed は、CakePHP がパスワードや Cookie に保存する情報を、
ハッシュ化や暗号化する際に利用される様ですので以下の生成ツールを使って生成しておきましょう。
[CakePHP] Security.salt 生成ツール - 変換商社


Post モデルの作成

/app/Model/の中にPost.phpを作成します。

class Post extends AppModel {
}

これだけでデータベースとやりとりする土台ができました。

Posts コントローラの作成

/app/Controller/の中にPostsController.phpを作成します。

class PostsController extends AppController {
    public $helpers = array('Html', 'Form');

    public function index() {
        $this->set('posts', $this->Post->find('all'));
    }
}

$helpersを宣言する事で後でViewを編集する時に便利な機能が使える様になります。(下記の例では使っていませんが)
function index()は投稿記事の一覧表示用の関数です。
ここではpostsテーブルの中身を全て参照して、postsという変数に入れています。
これによりViewで$postsを呼び出すことで、データを参照することが可能になります。

Post ビューの作成

/app/View/の中にPostsディレクトリを作成し、その中にindex.ctpを作成します。

<h2>記事一覧</h2>
<ul>
	<?php foreach ($posts as $post) : ?>
	<li>
		<?php echo h($post['Post']['title']); ?>
	</li>
	<?php endforeach; ?>
</ul>

Controllerから渡ってきた$posts(データベースの中身)を、
h($post['Post']['title'])という形で参照することができます。
ここでのh()はCakePHPが用意しているエスケープ処理をするための関数です。
['Post']モデルに関連するpostsテーブルの['title']カラムのデータを参照しているという事です。

注意点

ここまででデータベースの中身を画面に表示するところまで行ってきたが、
CakePHPでは重要な命名規約が存在します。
まず、データベースにテーブルを作成した際に付けた「posts」という名前を起点に、
ModelではPost.php), ControllerではPostsController.php, ViewではPostsというディレクトリを作成して、Controllerで作成したfunction(ここではindex())と同じ名前のindex.ctpを先ほどのディレクトリ内に作成します。

詳しい命名規則は以下のリンクにわかりやすくまとめられています。
cakePHP2.xの命名規約 | CakePHP2.1初心者メモ


まとめ

  • CakePHPをダウンロード
  • Tmp ディレクトリのパーミッションを変更
  • データベースの準備(postsテーブル作成)
  • /app/Model/の中にPost.phpを作成
  • /app/Controller/の中にPostsController.phpを作成
  • /app/View/の中にPostsディレクトリを作成し、その中にindex.ctpを作成
  • 命名規則に注意


DEMOでは他にも記事の追加、編集、削除をできる様にしたり、
新しくテーブルとModelとControllerを作って、コメント機能を追加したりもしてみました。

マニュアルも充実しているので、後はフレームワークなので慣れる事が大事なのかなと思います。

全ソースはこちら

github.com

関連アプリ・書籍

Webアプリ開発を加速する CakePHP2定番レシピ119

Webアプリ開発を加速する CakePHP2定番レシピ119

CakePHP2 実践入門 (WEB+DB PRESS plus)

CakePHP2 実践入門 (WEB+DB PRESS plus)