CakePHPの構造

CakePHPには、コントローラ、モデル、ビューのクラスがあります。しかし、MVCでの開発をよりすばやく、楽しめるものにするために、幾つかの追加クラスとオブジェクトがあります。コンポーネント(Components)、ビヘイビア(Behaviors)、ヘルパー(Helpers)は、拡張性と再利用性を実現するクラスで、アプリケーションのMVC基礎クラスにすばやく機能を追加できます。今は大枠をつかむだけにして、後で各ツールの詳細を調べましょう。

コントローラの拡張 ("コンポーネント")

コンポーネントは、コントローラのロジック内で手伝いをするクラスのことです。もし、複数のコントローラ(またはアプリケーション)で共通に使いたいロジックがあれば、通常、コンポーネントにするのがいちばん良い方法です。例えば、コアに含まれるEmailComponentクラスは、Emailを簡単に作成、送信することができます。一つのコントローラの中にこのロジックを書いてしまうのではなく、ロジックをパッケージ化して、共通に使えるようにできるわけです。

コントローラには、幾つかのコールバック(callbacks)もあります。CakePHPコアの動作中に自分のロジックを割り込ませたい場合、コールバックを使うことができます。使用できるコールバックには次のものがあります:

  • beforeFilter()、すべてのコントローラのアクションロジックの実行前に呼ばれます。

  • beforeRender()、コントローラロジックの実行後、しかしビューの表示(render)前に実行されます。

  • afterFilter()、すべてのコントローラロジックを実行し、ビューの表示(render)が終わった後に実行されます。手動でrender()をコントローラから呼び、その後にロジックを実行しているのでない限り、afterRender()afterFilter()には違いがありません。

ビューの拡張

ヘルパーは、ビューのロジックを手伝うクラスのことです。コンポーネントがコントローラ内で使用されるのと同じように、ヘルパーによって、複数のビューから共通の表現用ロジックにアクセスできるようにします。コアに含まれるヘルパーのひとつ、AjaxHelperを使うと、ビュー内でのAjaxリクエストを非常に簡単に扱えます。

たいていのアプリケーションには、繰り返し利用されるビューのコードがあります。CakePHPはレイアウト(layout)とエレメント(element)によってビューコードの再利用を促進します。デフォルトでは、コントローラによって表示されるすべてのビューは、レイアウトの中に配置して表示されます。エレメントは、切れはし(snippet)を作って複数のビューの中で繰り返し利用したい時に使用できます。

モデルの拡張

同様に、ビヘイビアはモデル間で共通の機能を追加する方法として利用できます。例えば、ユーザデータをツリー構造で保存する場合、User modelをツリーのように動作させるよう指定し、ツリー構造の中でのノードの削除、追加、移動などの機能を使うことができます。

モデルは、データソース(DataSource)と呼ばれるもう一つのクラスによっても支えられています。データソースは、異なるタイプの一連のデータについて、モデルがそれを操作できるように抽象化するものです。CakePHPアプリケーションの主なソースは、通常データベースですが、RSSフィード、CVSファイル、LDAPエントリ、iCalイベントなどをモデルが扱えるようなデータソースを追加することもできます。データソースは、異なるソースからのレコードを関連づけることも可能になっています。つまり、SQLのJoinだけに制限されているわけではなく、LDAPモデルに多くのiCalイベントを関連付けるようなことも可能です。

コントローラと同じように、モデルにもコールバックがあります:

  • beforeFind()

  • afterFind()

  • beforeValidate()

  • beforeSave()

  • afterSave()

  • beforeDelete()

  • afterDelete()

これらのメソッドの名前を見れば、何をするものか分かるはずです。モデルの章で詳細について調べてください。

アプリケーションの拡張

コントローラ、ヘルパー、モデルには親クラスがあり、アプリケーション全体に変更を加えることができます。AppController (/app/app_controller.phpの位置に置きます。)、AppHelper (/app/app_helper.phpの位置に置きます。)と、AppModel (/app/app_model.phpの位置に置きます。)は、すべてのコントローラ、ヘルパー、モデルで共有するようなメソッドを置くのに良い場所です。

クラスやファイルではありませんが、routesは、CakePHPにリクエストを送る役割を果たしています。Routeを定義することによって、URLとコントローラのアクションをどのように結びつける(map)かがCakePHPに伝えられます。URL “/controller/action/var1/var2”は、デフォルトの動作では、Controller::action($var1, $var2)にマップされます。しかし、routesを使うとURLをカスタマイズでき、アプリケーション内でどのように解釈するかを設定できます。

アプリケーション内の機能の中には、そっくりそのままパッケージ化してしまうと便利なものもあります。プラグイン(plugin)はモデル、コントローラ、ビューをパッケージ化したもので、ある特定の目的のために複数のアプリケーションで使えるようにしたものです。ユーザ管理システムや簡単なブログシステムなどを、CakePHPのプラグインにできるでしょう。