CakePHP (日本語) とは PHP で動作する Web システム開発のための RAD フレームワークです。
フレームワークとは、ソフトウェアを構築する際、共通性のあるロジックの実装を肩代わりする役割を持つプログラム群です。その中でも開発速度を短縮するための機能を持つフレームワークを RAD フレームワークと呼びます。
フレームワークを採用することで、開発者は、これから開発するシステムの中心的なロジックの実装を優先的に、そして集中的に取り組むことが出来ます。また、共通性のあるロジックの実装を肩代わりするという性質は、生産性を高め、開発運用が長期にわたっても、あるいは開発するスタッフが変わっても、保守性と品質を保ちやすくなるという作用もあります。
Web システム開発の RAD フレームワークである CakePHP には次のような特徴があります。
ここでは CakePHP の採用を検討する際のポイントとなる部分を紹介します。
- 1. 商用利用が可能
- CakePHP は、 MIT ライセンス です。営利目的のサイト構築にも使用が可能です。
- 2. PHP4 or PHP5 かつ PEAR 非依存
- CakePHP は、同じソースコードで PHP4 と PHP5 のどちらでも動作します。また、 PEAR を使用していないので、ホスティングをはじめとする多くの環境で動作します。
- 3. データベースと連携し SQL を wrap した CRUD が可能
- CakePHP は、独自のルールでデータベースのアソシエーション(リレーション)を理解し、ほとんどのスクリプトで SQL を用いずにプログラムが記述可能です。
- 4. Scaffoldingが可能
- CakePHP は、 RoR のような Scaffolding を実現します。開発の初期にはマスタテーブルの仕様が決まっていないことがしばしばありますが、 Scaffolding で必要なデータとデータの形式を管理すれば、真っ先に主となるロジックの実装に着手できる可能性が高くなります。
- 5. MVC パターンを採用
- CakePHP は、 Web アプリケーション開発において実績のある MVC パターンを用いた開発が可能です。
- 6. 見栄えの良い URL
- CakePHP は、 mod_rewrite と連携することで、とても見栄えの良い URL をデザインすることが可能です。また Admin Routing や WebServices など URL の形式から出力するデータを切り替える仕組みを持っています。これは同じアクションで HTML を出力したい場合と XML を出力したい場合の2パターンが考えられる際に役に立ちます。
- 7. 柔軟なテンプレート
- CakePHP は、テンプレートを 100% pure PHP で記述します。開発者は PHP のみを理解すればテンプレートを記述することが可能となります(ちなみに、テンプレートを Smarty で記述することも可能で、方法は Web の随所で見つけることが可能です)。また、 HTML の外観を決めるレイアウトや、再利用可能コードを部品化するエレメントなど、大規模な開発にも耐えうる工夫がなされています。
- 8. 豊富な標準ライブラリ
- CakePHP は、再利用可能なロジックをライブラリ(ビヘイビア、コンポーネント、ヘルパー)として提供します。ライブラリはセキュリティや認証、 HTML 構築や Ajax 対応など多岐にわたり、 Web システムの構築に十分なラインナップとなっています。
- 9. サニタイジング
- CakePHP は、データをサニタイズするライブラリを持っています。さらに徹底的にデータを洗いたい場合には、リクエストとレスポンスの全変数のフローへユーザコードをフックすることが可能です。
- 10. アクセスコントロール
- CakePHP は、標準にして十分なアクセスコントロールを持っています。アクセスコントロールにはデータベースを用いる方法と、設定ファイルを用いる方法の2種類があり、 Web アプリケーションの規模に応じて適切な手段を選択することが可能です。
- 11. ビューのキャッシュ
- CakePHP は、以前処理したことのあるビューを記憶しておき、同じリクエストに対するレスポンスをキャッシュから返すことでレスポンスタイムを短縮させることが可能です。また、キャッシュしないリクエストを指定したり、データベースの内容が変更された場合にキャッシュを再構築したりすることが可能です。強制的にキャッシュをクリアすることも可能で、主立ったキャッシュの要件を実現しています。
- 12. シンプルなソースの設置
- CakePHP は、展開したアーカイブを Web サーバにディレクトリごと転送し、設定ファイルの一部(データベース接続情報)を編集するだけで動作します( Web サーバの設定によっては1カ所パーミッションの変更が必要)。しかし Web アプリケーションを正式リリースする際には、ドキュメントルート以下には設定ファイルやロジックを置きたくないこともあるかと思います。そういった場合でも定数をいくつか編集するだけで、そのようなファイルをドキュメントルート以下から移動することが可能です。
すでに CakePHP 以外の実績あるフレームワークも数多く存在します。以下は CakePHP 入門者や、他のフレームワークから CakePHP へ移行を検討している方に有益かと思われます。
MVC パターン
CakePHP では URL からコントローラとアクションを決定します。ドキュメントルートの直下にフロントコントローラ( index.php )がある場合、以下は…
http://sample.tld/users/regist
users というコントローラの regist というアクションにマッピングされます。具体的なサンプルは次のようになります。
<?php
class UsersContorller extends AppController
{
function regist()
{
}
}
?>
別のアクションを追加するには regist() と同じようにメソッドを追加します。
セキュリティ
CakePHP では、シンプルでありながら有用なセキュリティ対策があります。フレームワークを選択する際、気になるのは post データの改ざんを防止できるか?という点です。 CakePHP では2つのアプローチと1つの鉄則があります。
- post 以外のリクエストを拒否する
- 正規のトークンを含まないリクエストを拒否する( Struts 風)
後者は post データの改ざんに加え、送信ボタンの2度押しをブロックする作用もあります。しかし、これで post データの改ざんを完璧に防げるわけではありません。たとえば form の hidden 要素を input に変更したり、リクエストをキャプチャしてデータを書き換えたりする手段は容易に見つけることができます。 post データは永続化する直前でバリデータに通す必要があります。これが鉄則ですが、 CakePHP ではデータを永続化する際にバリデータが自動的に働きますので、検証ルールの不備がなければあまり意識しなくても済むかもしれません。
サニタイジング
CakePHP の提供するサニタイザには HTML や SQL などのメタ文字をエスケープするという基本的なメソッドが提供されています。しかし、おそらくもっとも頻繁に利用されるであろう HTML ヘルパーでは、データを出力する際、自動的に HTML のメタ文字をエスケープしますので、ごく単純なメールフォームなどの Web アプリケーションでは、サニタイズを意識することが無いかも知れません。
また、入力と出力のデータを徹底的に浄化したい場合、リクエストからコントローラ、コントローラからビューへと遷移する2カ所でデータを掌握できるタイミングがあります。そこでは、たとえば ascii コード中の不可視バイトを削除することができます。
フィルタチェイン・アクションチェイン
CakePHP ではフィルタチェインとアクションチェインを直接的に設定する場所はありません。フィルタチェインは Controller::beforeFilter() を拡張して記述します。アクションチェインはアクション内で Controller::requestAction() を呼び出すことで実現します。 Controller というのはコントローラの基底クラスです。
ソースの自動生成
CakePHP には bake.php というソースジェネレータがあります。 bake.php ではモデル、コントローラ、ビューの3つを生成可能です。 bake.php を利用すると scaffold と同等のソースを生成します。
なお、 bake.php で生成されるソースは、たとえば、よくあるマスタ管理の新規登録や編集に際して、データ入力画面と登録完了画面との間に確認画面を挟みません。これは日本ではあまり好まれないスタイルかも知れませんが、当然、自分でロジックを記述すれば、確認画面を挟むことは簡単です。