第4章 Zend_Controller

目次

4.1. 概要
4.1.1. 導入
4.1.2. ルーティング処理
4.1.3. ディスパッチトークン
4.1.4. ディスパッチ処理
4.2. さあ、はじめましょう
4.2.1. 導入
4.2.2. サーバの設定
4.2.3. 起動用ファイル
4.2.4. ディレクトリ構造
4.2.5. IndexController
4.3. サブクラス化
4.3.1. 導入
4.3.2. 規約
4.3.3. ルータのインターフェイス
4.3.4. ディスパッチャのインターフェイス
4.4. プラグイン
4.4.1. 導入

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_DispatcherZend_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_FrontZend_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 を受け取り、含まれる情報 (コントローラ名、アクション名およびオプションのパラメータ) を展開し、コントローラのインスタンスを作成してそのコントローラのアクションをコールします。