先日CakePHPを使ったシステムを作りました。
サーバ環境の都合でバージョンは1.3.14。DBはMySQLでテーブル数15、コントローラ数19、モデル数25、ビュー数47(layouts、elements等も含めて)といった規模のシステム開発でしたが、空き時間を使って2ヶ月程度で作成しました。(管理作業を除く製造部分の実工数で言えば、多めに見てもこの3分の1位だと思います。)
開発環境として一番手馴れたCodeIngniterが昨今のライセンス問題で積極的に使いたくなかったこと、あまり時間的な余裕が無かったこともあり初めはSmary+PEARライブラリでの知れた構成でこなそうと思いましたが、せっかくの機会に新しいFWを経験したかったのでCakePHPを使ってみました。
多少学習に苦労はしたものの、結果として予想していた範囲内の工数で仕上げることができ、さらにCakePHPに慣れることができたのは良い選択でした。そして、何より新しいことを覚えるのはやっぱり楽しいですね。
せっかくなので、初めてのCakePHP開発で感じたことや気を付けたことを覚えている範囲でざくっとまとめてみます。
まずはルールを覚えること
CakePHP使えばすぐ開発が高速化するみたいなイメージがありますが、やっぱり始めは覚えることがいろいろとあります。基本的な規約に始まって、MVCの使い方、コンポーネント・ビヘイビア・ヘルパーやコア関数、バリデーション、認証、プラグイン、CakePHPならではの作法など・・・。
大まかな作業の流れとしては、bakeで雛形作成 → 必要な付加機能を学びながら肉付けしていく → CRUDを備えた機能が1本完成 → それをベースに他機能を量産、という感じで一つ機能ができてからようやく開発速度が上がっていくイメージでした。
それでも覚えること自体に抵抗があったわけではなく、一つの事を覚えればその分一つ開発効率が上がる感覚で、学習を楽しみながら進められた気がします。
プラグインを活用する
CakePHPにはすでに便利なプラグインが多く存在しています。既にあるものは有り難く使わせてもらって、コスト削減、品質向上に努めましょう。
なお今回のシステムで利用したプラグインは定番のものばかりですが、参考までに紹介しておきます。
- DebugKit
- 開発時にお役立ちなデバッグ情報をツールバーに表示してくれるプラグインです。もう標準で入っていてもいいと思うほどな便利ツール。
- cakeplus
- 汎用的によく使われる処理がまとめられたプラグインです。日本語関連のバリデーションやhtmlエスケープコンポーネントを使わせて頂きました。
- Qdmail
- メール送信ライブラリ。日本語メールの取り扱いなど、余計な作業に気を回す必要が無くなり大助かり。
- OrderedBehavior
- 順序を管理するプラグイン。表示順を持った項目を扱ったので、$this->Item->sortby(‘sort_no ASC’, $parent_id);でがつんと並び替え!みたいな処理が非常に楽でした。
モデルの構成について
ModelsはDBアクセスモデルとサービスモデルの2種類を作成しました。
大まかな役割としては、DBアクセスモデルはテーブル毎に用意してfind()、save()などCake標準メソッドでDBアクセスを行うクラス、サービスモデルはコントローラとDBアクセスモデルの中間でビジネスロジックを扱うクラスという位置付けです。
1つのコントローラ(ItemsController)に対して関連するサービスモデル(ItemService)を1つ作成、サービスモデルからは必要なDBアクセスモデル(Item)を複数生成して利用する、という利用イメージになります。
チュートリアルやbakeで作られる基本構成のモデルはテーブルと対になるモデルだけですが、それだけだと複数テーブルに渡る処理をどのモデルに書けばいいかとか、コントローラのコードをモデルに移したいといった場合を考慮して、サービスモデルを用意しました。
自分的にはこの構成で分かりやすかったのですが、皆さんはどのような使い方をされているんでしょうね。
アソシエーションにこだわらない
CakePHP主要機能の一つであるモデルのアソシエーションですが、私はなかなか取り扱いに慣れませんでした(特に3テーブル以上結合するようなケースになると思うようなクエリが実行できず・・・)。そこで若干の敗北感は感じつつも、途中からはアソシエーションに全て依存する作りはやめて自分が分かりやすく書けるような作りに割り切ることにしました。
その結果としてこんなルール付けで作業を進めました。
- アソシエーションはbelongs_toしか使わなかった。
- 複雑なクエリはDBアクセスモデルでSQLを直接書いてもいい。
- または複雑なクエリになる場合はDBアクセス処理を小分けにする(例えば、条件からキーを取得する処理 → 取得したキーからリストを取得する処理を分ける)。
ちなみにこの辺りのモデル周りについて、shin1x1さんのエントリは参考になります。viewを使う方法等はぜひ今後使ってみたいと思いました。
- CakePHP Modelに関する6つの誤解 – Shin x blog
- CakePHP Modelとの付き合い方(CakePHP Advent Calendar 2010 3日目) – Shin x blog
Viewではヘルパーを使うこと
まあごくあたり前のことですが、改めて感じたので。
始めはその方が早かったりして素のHTMLのまま書きたくなることもありますが、極力用意されているヘルパーは使った方が良いです。便利なことはもちろん、共通の属性を付与したいとか一括で挙動を変えたい場合等、後になって助けられることが多いはずですので。
特にHtml->link()、Html->img()といったリンク絡みのヘルパーは、開発→本番環境でディレクトリ構成が変わる場合に柔軟にリンクを変えてくれたりして幸せになれます。
設定関連はbootstrap.phpにまとめる
コア設定やアプリケーション独自定数の設定といった管理はbootstrap.phpに書くようにしました。一箇所に設定がまとまってると分かりやすいですね。
[php]
app/config/bootstrap.php
// core.phpの設定を上書き
Configure::write(‘debug’, 2);
// アプリケーション独自の定数
define(‘MYAPP_ON’, 1);
define(‘MYAPP_OFF’, 0);
[/php]
また開発用、本番用といった設定切り替えも、bootstrap.phpで環境設定用定数で行うようにしました。
[php]
app/config/bootstrap.php
// 実行環境
Configure::write(‘myapp.env’, ‘development’);
//Configure::write(‘myapp.env’, ‘staging’);
//Configure::write(‘myapp.env’, ‘product’);
// デバッグモード
if (Configure::read(‘myapp.env’) == ‘development’) {
Configure::write(‘debug’, 2);
} else {
Configure::write(‘debug’, 0);
}
[/php]
DBの設定切り替え等もこれで対応できます。
[php]
app/config/database.php
class DATABASE_CONFIG {
var $default = array();
// ローカル開発環境
var $development = array(
‘driver’ => ‘postgres’,
‘persistent’ => false,
‘host’ => ‘ホスト名’,
‘login’ => ‘ログイン名’,
‘password’ => ‘パスワード’,
‘database’ => ‘DB名’,
);
// ステージング環境
var $staging = array(
‘driver’ => ‘postgres’,
‘persistent’ => false,
‘host’ => ‘ホスト名’,
‘login’ => ‘ログイン名’,
‘password’ => ‘パスワード’,
‘database’ => ‘DB名’,
);
// 本番環境
var $staging = array(
‘driver’ => ‘postgres’,
‘persistent’ => false,
‘host’ => ‘ホスト名’,
‘login’ => ‘ログイン名’,
‘password’ => ‘パスワード’,
‘database’ => ‘DB名’,
);
public function __construct()
{
$connection = Configure::read(‘myapp.env’);
if ($this->{$connection}) {
$this->default = $this->{$connection};
}
}
}
[/php]
ちなみに設定切り替えについては、IPアドレスやApache環境変数等で判断する手法もあったりしますが、極力外部要因は少なくアプリケーション内で完結するやり方が自分的には使いやすい感じです。
- 開発環境と本番環境で設定情報を使い分ける – cakephperの日記(CakePHP, MongoDB)
- “開発と運用の設定を自動で切り替える” フォーラム – CakePHP Users in Japan
参考にした情報
CakePHPの公式マニュアルはとても充実していますが日本語版は不完全な箇所があり、英語版を見るかネット上の最新情報で確認した方が間違いないようです。私も最初bakeで生成されたコードとマニュアルの記述が違っている箇所で正しく動作しないことがあり、しばらく詰まったりしました。。
私は始めにマニュアルのブログチュートリアルを一通りやってみて、後はその都度知りたい項目をググったり本で調べながら作業を進めました。
ネット上では主にCakePHP情報を多く発信している著名な方々のブログを参考にすることが多かったです。
また、本は「CakePHP辞典」を一冊購入しました。
この本は機能毎の目次がとても見やすく整理されていて必要な情報が探しやすいこと、また公式マニュアルやAPIドキュメント以上にメソッドのオプションについて細かい説明が記載されていて、傍らに置いておくリファレンスとして大活躍でした。findメソッドやformヘルパーのページとか何度見返したことやら・・・。対象はバージョン1系ですが、条件に合う方にはおすすめの一冊です。
長々書いた割にはあまり詳しい話でも無く有用な情報は少ないかもしれませんが、CakePHPに興味を持っている方やこれから使ってみる方の少しでも参考になればと思います。
せっかく覚えたCakeで、次も何か作ってみたいと思います。