第4章 Zend_Controller
前のページ |  | 次のページ

## 第4章 Zend_Controller

## 4.1. 概要

### 4.1.1. 導入

`Zend_Controller` は、モデル - ビュー - コントローラ (MVC) パターンに基づいたウェブサイトを構築するための基本機能を提供します。

`Zend_Controller` は軽量で部品化されており、拡張しやすいように設計されています。 この設計は、柔軟性および利用者に対する自由度を確保するための最低限のものであり、 `Zend_Controller` を使用して構築したシステムは、 ほぼ同じようなコード配置・規約を共有することができます。

`Zend_Controller` の処理の流れは、 いくつかの部品にわかれて実装されています。 これらの部品のすべてを完璧に理解する必要はありませんが、 処理の概要を知っておくことは有用です。

- `Zend_Controller_Front` は、 `Zend_Controller` の処理全体を取りまとめます。 FrontController パターンであるといえます。 サーバから受け取ったすべてのリクエストを `Zend_Controller_Front` が処理し、最終的にリクエストを ActionController (`Zend_Controller_Action`) に委譲します。

- `Zend_Controller_Router` はルータです。URI を受け取り、 どのコントローラのどのアクションがリクエストを処理すべきなのかを決定します。 コントローラ、アクションおよびオプションのパラメータは `Zend_Controller_Dispatcher_Token` というオブジェクトにまとめられます。これが、 `Zend_Controller_Dispatcher` によって処理されます。 ルーティングが発生するのは一度だけ、 つまり最初にリクエストを受け取って最初のコントローラに渡される際のみです。

- `Zend_Controller_Dispatcher` はディスパッチャです。 `Zend_Controller_Dispatcher_Token` を受け取って適切なコントローラファイルを探し、 そのファイル内のコントローラクラス (`Zend_Controller_Action` を実装していなければなりません) のインスタンスを作成し、 最後にコントローラオブジェクトのアクションメソッドを実行します。 ルーティングが一度だけ発生するのとは異なり、 ディスパッチ処理は繰り返し発生します。 すべてのアクションが順にディスパッチされるまで、 `Zend_Controller_Dispatcher` は `Zend_Controller_Front` から繰り返しコールされます。

- `Zend_Controller_Action` はコントローラの基底コンポーネントです。 各コントローラは `Zend_Controller_Action` クラスを継承した単一のクラスで、アクションメソッドを持っています。

`Zend_Controller` の処理の流れは比較的シンプルです。 `Zend_Controller_Front` がリクエストを受け取り、 `Zend_Controller_Router` をコールして、 配送先となるコントローラ (そしてコントローラ内のアクション) を決定します。`Zend_Controller_Router` は URI を分解して `Zend_Controller_Dispatcher_Token` オブジェクトに保存します。ここに配送先の情報が含まれます。 その後、`Zend_Controller_Front` はディスパッチループに突入します。 まず `Zend_Controller_Dispatcher` をコールしてトークンを渡し、 実際のコントローラ・アクションに処理を渡します。 コントローラが終了すると、処理は `Zend_Controller_Front` に戻ります。コントローラが新しいトークンを返した (別のコントローラを処理するように指示された) 場合は、 ループが続けられて次の配送処理が行われます。 それ以外の場合は、処理がそこで終了します。

### 4.1.2. ルーティング処理

はじめてのコントローラを作り始める前に、ルーティング処理が `Zend_Controller_Router` でどのように実装されているのかを知る必要があるでしょう。 処理手順として、一度だけ発生するルーティングと繰り返し発生するディスパッチがあることを覚えておきましょう。

`Zend_Controller_Front` は `Zend_Controller_Router` をコールし、URI をコントローラとアクションに対応させます。 `Zend_Controller_Router` は URI を受け取ってそれを分解し、 バリューオブジェクト `Zend_Controller_Dispatcher_Token` に保存します。 そしてそれがディスパッチャ (`Zend_Controller_Dispatcher`) に渡されます。

ルータがコントローラ名とアクション名を決定する方法は、単純なものです。

    http://framework.zend.com/controller/action/

上の例で、最初の部分が常にコントローラの名前となり、 2 番目の部分が常にアクションの名前となります。

オプションで、コントローラに渡すパラメータを URI に含めることができます。 これは キー/値 の組み合わせの形式になります。

    http://framework.zend.com/controller/action/key1/value1/

URI の `/controller/` の部分に何も存在しない場合は、 "`index`" と解釈されます。また URI の `/action/` の部分に何も存在しない場合は、"`index`" と解釈されます。 以下の例を参照ください。

    http://framework.zend.com/roadmap/future/
    コントローラ: roadmap
    アクション  : future

    http://framework.zend.com/roadmap/
    コントローラ: roadmap
    アクション  : index

    http://framework.zend.com/
    コントローラ: index
    アクション  : index

| 注意
現在、新しいルータを開発中です。このルータには URI の置換エンジンが含まれており、 現在のルータよりはるかに柔軟に使うことができます。 これは、ごく近い将来に予定されているプレビュー版に含まれる予定です。

コントローラの名前、コントローラ内のアクションの名前、 そしてオプションのパラメータの内容が、ひとつのトークン `Zend_Controller_Dispatcher_Token` にまとめられます。 このトークンは `Zend_Controller_Front` に返され、 ディスパッチループに突入します。ディスパッチループに入ると、このトークンが `Zend_Controller_Dispatcher` に渡されます。

### 4.1.3. ディスパッチトークン

ディスパッチトークンは単純なバリューオブジェクトで、 ルータやディスパッチャのインターフェイスを実装したクラスと `Zend_Controller_Front` との間のデータのやり取りに使用されます。 これはコントローラ、アクションそしてアクションに渡すパラメータの内容をまとめたものです。

- コントローラ名へのアクセスは `getControllerName()` および `setControllerName()` によって行います。

- コントローラ内からコールされるアクションの名前へのアクセスは `getActionName()` および `setActionName()` によって行います。

- アクションに渡されるパラメータは キー/値 の組み合わせからなる連想配列で、 `getParams()` および `setParams()` によってアクセスします。

### 4.1.4. ディスパッチ処理

ディスパッチ処理は、トークン `Zend_Controller_Dispatcher_Token` を受け取り、含まれる情報 (コントローラ名、アクション名およびオプションのパラメータ) を展開し、コントローラのインスタンスを作成してそのコントローラのアクションをコールします。

前のページ |  | 次のページ
3.4. Zend_Config_Xml | ホーム | 4.2. さあ、はじめましょう