# CakePHP の構造

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

<a id="application-extensions"></a>

## アプリケーションの拡張

コントローラ、ヘルパー、モデルには親クラスがあり、アプリケーション全体に変更を加えることができます。
AppController (`src/Controller/AppController.php` に配置) 、
AppHelper (`src/View/Helper/AppHelper.php` に配置) と、
AppModel (`src/Model/AppModel.php` に配置) は、すべてのコントローラ、
ヘルパー、モデルで共有するようなメソッドを置くのに良い場所です。
従来の `app/` 構成では、これらのファイルは `app/Controller/`、`app/View/Helper/`、`app/Model/` にあります。

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

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

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

コンポーネントは、コントローラのロジック内で手伝いをするクラスのことです。
もし、複数のコントローラ（またはアプリケーション）で共通に使いたいロジックがあれば、通常、
コンポーネントにするのがいちばん良い方法です。例えば、コアに含まれる AuthComponent クラスを使うと、
すべてのコントローラにログインとアクセス制御を簡単に追加できます。一つのコントローラの中にこのロジックを
書いてしまうのではなく、ロジックをパッケージ化して、共通に使えるようにできるわけです。

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

- `Controller::afterFilter()` 、 ビューの表示 (*render*) を含むすべての
  コントローラのロジックの後に実行されます。
- `Controller::beforeFilter()` 、 コントローラのアクションロジックの実行前に
  呼ばれます。
- `Controller::beforeRender()` 、 コントローラロジックの実行後、しかしビューの
  表示(*render*)前に実行されます。

## モデルの拡張 ("ビヘイビア")

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

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

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

- beforeFind()
- afterFind()
- beforeValidate()
- afterValidate()
- beforeSave()
- afterSave()
- beforeDelete()
- afterDelete()

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

## ビューの拡張("ヘルパー")

ヘルパーは、ビューのロジックを手伝うクラスのことです。コンポーネントがコントローラ内で使用されるのと
同じように、ヘルパーによって、複数のビューから共通の表現用ロジックにアクセスできるようにします。
コアに含まれるヘルパーのひとつ、FormHelper を使うと、モデルと連携するフォームを非常に簡単に作成できます。

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