標準のルータ

ディスパッチャ

概要

ディスパッチ処理は、リクエストオブジェクトである Zend_Controller_Request_Abstract を受け取り、 そこに含まれる情報 (モジュール名、コントローラ名、アクション名およびオプションのパラメータ) を展開し、コントローラのインスタンスを作成してそのコントローラのアクションをコールします。 モジュールやコントローラ、アクションが見つからない場合は、 デフォルト値を使用します。Zend_Controller_Dispatcher_Standard では、コントローラとアクションのデフォルトはどちらも index で、モジュールのデフォルトは default です。しかし、 setDefaultController() メソッドや setDefaultAction() メソッド、そして setDefaultModule() でこれらを変更することもできます。

Note: デフォルトモジュール
モジュール構造のアプリケーションを作成する場合に、 デフォルトのモジュールにも名前空間を定義したくなることもあるでしょう (デフォルトの設定では、デフォルトモジュールには名前空間が ありません)。1.5.0 以降では、 フロントコントローラあるいはディスパッチャで prefixDefaultModuleTRUE を設定すればこれが実現できるようになりました。

  1. // フロントコントローラで
  2. $front->setParam('prefixDefaultModule'// ディスパッチャで
  3. $dispatcher->setParam('prefixDefaultModule'
これにより、既存のモジュールをアプリケーションのデフォルトモジュールとすることができます。

ディスパッチ処理が発生するのは、フロントコントローラでのループの内部です。 ディスパッチ処理を行う前に、フロントコントローラはルーティングを行い、 ユーザが指定したコントローラとアクション、そして追加のパラメータを取得します。 それからディスパッチループに入り、リクエストを配送します。

ループ内では、まず最初にリクエストオブジェクトのフラグを設定します。 このフラグは、アクションがディスパッチされたことを示すものです。 アクション内や pre/postDispatch プラグインでこのフラグをリセットすると、 ディスパッチループがそのまま継続され、もう一度リクエストを処理しようとします。 リクエスト内のコントローラやアクションを変更してフラグをリセットすることで、 さまざまなリクエストを続けて実行させることができます。

このようなディスパッチ処理を制御する アクションコントローラのメソッドが _forward() です。 このメソッドを preDispatch()postDispatch() やアクションメソッドでコールし、 コントローラやアクション、 そして新しいアクションに送りたい追加のパラメータを指定します。

  1. span style="color: #808080; font-style: italic;">// 現在のモジュールおよびコントローラの、別のアクションに転送します
  2. 'bar''baz' => 'bogus'// 現在のモジュールにある、別のコントローラのアクション
  3.     // FooController::bazAction() に転送します
  4. 'baz', 'foo''baz' => 'bogus'// 別のモジュールにある、別のコントローラのアクション
  5.     // Foo_BarController::bazAction() に転送します
  6. 'baz', 'bar', 'foo''baz' => 'bogus'));
  7. }

ディスパッチャのサブクラスの作成

Zend_Controller_Front は、 まず最初にルータをコールして、 リクエスト内で最初にディスパッチできるアクションを決定します。 その後、ディスパッチャループに入り、ディスパッチャをコールしてアクションを振り分けます。

ディスパッチャが動作するためには、さまざまなデータが必要です。 たとえば、コントローラ名やアクション名を決定する方法、 コントローラクラスを探す場所、モジュール名が有効かどうか、 その他、リクエストの内容をディスパッチするために必要な情報を取得する API が必要となります。

Zend_Controller_Dispatcher_Interface では次のようなメソッドを定義しています。ディスパッチャは、これを実装しなければなりません。

  1. span style="color: #808080; font-style: italic;">/**
  2.      * Format a string into a controller class name.
  3.      *
  4.      * @param string $unformatted
  5.      * @return string
  6.      *//**
  7.      * Format a string into an action method name.
  8.      *
  9.      * @param string $unformatted
  10.      * @return string
  11.      *//**
  12.      * Determine if a request is dispatchable
  13.      *
  14.      * @param  Zend_Controller_Request_Abstract $request
  15.      * @return boolean
  16.      *//**
  17.      * Set a user parameter (via front controller, or for local use)
  18.      *
  19.      * @param string $name
  20.      * @param mixed $value
  21.      * @return Zend_Controller_Dispatcher_Interface
  22.      *//**
  23.      * Set an array of user parameters
  24.      *
  25.      * @param array $params
  26.      * @return Zend_Controller_Dispatcher_Interface
  27.      *//**
  28.      * Retrieve a single user parameter
  29.      *
  30.      * @param string $name
  31.      * @return mixed
  32.      *//**
  33.      * Retrieve all user parameters
  34.      *
  35.      * @return array
  36.      *//**
  37.      * Clear the user parameter stack, or a single user parameter
  38.      *
  39.      * @param null|string|array single key or array of keys for
  40.      *        params to clear
  41.      * @return Zend_Controller_Dispatcher_Interface
  42.      *//**
  43.      * Set the response object to use, if any
  44.      *
  45.      * @param Zend_Controller_Response_Abstract|null $response
  46.      * @return void
  47.      *//**
  48.      * Retrieve the response object, if any
  49.      *
  50.      * @return Zend_Controller_Response_Abstract|null
  51.      *//**
  52.      * Add a controller directory to the controller directory stack
  53.      *
  54.      * @param string $path
  55.      * @param string $args
  56.      * @return Zend_Controller_Dispatcher_Interface
  57.      *//**
  58.      * Set the directory (or directories) where controller files are
  59.      * stored
  60.      *
  61.      * @param string|array $dir
  62.      * @return Zend_Controller_Dispatcher_Interface
  63.      *//**
  64.      * Return the currently set directory(ies) for controller file
  65.      * lookup
  66.      *
  67.      * @return array
  68.      *//**
  69.      * Dispatch a request to a (module/)controller/action.
  70.      *
  71.      * @param  Zend_Controller_Request_Abstract $request
  72.      * @param  Zend_Controller_Response_Abstract $response
  73.      * @return Zend_Controller_Request_Abstract|boolean
  74.      *//**
  75.      * Whether or not a given module is valid
  76.      *
  77.      * @param string $module
  78.      * @return boolean
  79.      *//**
  80.      * Retrieve the default module name
  81.      *
  82.      * @return string
  83.      *//**
  84.      * Retrieve the default controller name
  85.      *
  86.      * @return string
  87.      *//**
  88.      * Retrieve the default action
  89.      *
  90.      * @return string
  91.      */

しかし、たいていの場合は単純に抽象クラス Zend_Controller_Dispatcher_Abstract を継承するだけで事足りるでしょう。ここには、これらのメソッドがすでに定義されています。 あるいは、Zend_Controller_Dispatcher_Standard を継承して、標準の機能と異なる部分だけを変更するということも可能です。

ディスパッチャのサブクラスを作成する必要がある場面としては、 たとえばアクションコントローラ内で 標準とは異なるクラス名やメソッド名の命名規則を使用したいなどということが考えられます。 あるいは、クラスメソッドに振り分けるのではなく コントローラディレクトリは以下のアクションファイルに振り分けるなど、 異なるディスパッチ方式を使用したい場合にもサブクラスを作成する必要があります。


標準のルータ