Documentation

ディスパッチャ - Zend_Controller

ディスパッチャ

概要

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

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

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

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

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

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

  1. public function fooAction()
  2. {
  3.     // 現在のモジュールおよびコントローラの、別のアクションに転送します
  4.     $this->_forward('bar', null, null, array('baz' => 'bogus'));
  5. }
  6.  
  7. public function barAction()
  8. {
  9.     // 現在のモジュールにある、別のコントローラのアクション
  10.     // FooController::bazAction() に転送します
  11.     $this->_forward('baz', 'foo', null, array('baz' => 'bogus'));
  12. }
  13.  
  14. public function bazAction()
  15. {
  16.     // 別のモジュールにある、別のコントローラのアクション
  17.     // Foo_BarController::bazAction() に転送します
  18.     $this->_forward('baz', 'bar', 'foo', array('baz' => 'bogus'));
  19. }

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

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

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

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

  1. interface Zend_Controller_Dispatcher_Interface
  2. {
  3.     /**
  4.      * Format a string into a controller class name.
  5.      *
  6.      * @param string $unformatted
  7.      * @return string
  8.      */
  9.     public function formatControllerName($unformatted);
  10.  
  11.     /**
  12.      * Format a string into an action method name.
  13.      *
  14.      * @param string $unformatted
  15.      * @return string
  16.      */
  17.     public function formatActionName($unformatted);
  18.  
  19.     /**
  20.      * Determine if a request is dispatchable
  21.      *
  22.      * @param  Zend_Controller_Request_Abstract $request
  23.      * @return boolean
  24.      */
  25.     public function isDispatchable(
  26.         Zend_Controller_Request_Abstract $request
  27.     );
  28.  
  29.     /**
  30.      * Set a user parameter (via front controller, or for local use)
  31.      *
  32.      * @param string $name
  33.      * @param mixed $value
  34.      * @return Zend_Controller_Dispatcher_Interface
  35.      */
  36.     public function setParam($name, $value);
  37.  
  38.     /**
  39.      * Set an array of user parameters
  40.      *
  41.      * @param array $params
  42.      * @return Zend_Controller_Dispatcher_Interface
  43.      */
  44.     public function setParams(array $params);
  45.  
  46.     /**
  47.      * Retrieve a single user parameter
  48.      *
  49.      * @param string $name
  50.      * @return mixed
  51.      */
  52.     public function getParam($name);
  53.  
  54.     /**
  55.      * Retrieve all user parameters
  56.      *
  57.      * @return array
  58.      */
  59.     public function getParams();
  60.  
  61.     /**
  62.      * Clear the user parameter stack, or a single user parameter
  63.      *
  64.      * @param null|string|array single key or array of keys for
  65.      *        params to clear
  66.      * @return Zend_Controller_Dispatcher_Interface
  67.      */
  68.     public function clearParams($name = null);
  69.  
  70.     /**
  71.      * Set the response object to use, if any
  72.      *
  73.      * @param Zend_Controller_Response_Abstract|null $response
  74.      * @return void
  75.      */
  76.     public function setResponse(
  77.         Zend_Controller_Response_Abstract $response = null
  78.     );
  79.  
  80.     /**
  81.      * Retrieve the response object, if any
  82.      *
  83.      * @return Zend_Controller_Response_Abstract|null
  84.      */
  85.     public function getResponse();
  86.  
  87.     /**
  88.      * Add a controller directory to the controller directory stack
  89.      *
  90.      * @param string $path
  91.      * @param string $args
  92.      * @return Zend_Controller_Dispatcher_Interface
  93.      */
  94.     public function addControllerDirectory($path, $args = null);
  95.  
  96.     /**
  97.      * Set the directory (or directories) where controller files are
  98.      * stored
  99.      *
  100.      * @param string|array $dir
  101.      * @return Zend_Controller_Dispatcher_Interface
  102.      */
  103.     public function setControllerDirectory($path);
  104.  
  105.     /**
  106.      * Return the currently set directory(ies) for controller file
  107.      * lookup
  108.      *
  109.      * @return array
  110.      */
  111.     public function getControllerDirectory();
  112.  
  113.     /**
  114.      * Dispatch a request to a (module/)controller/action.
  115.      *
  116.      * @param  Zend_Controller_Request_Abstract $request
  117.      * @param  Zend_Controller_Response_Abstract $response
  118.      * @return Zend_Controller_Request_Abstract|boolean
  119.      */
  120.     public function dispatch(
  121.         Zend_Controller_Request_Abstract $request,
  122.         Zend_Controller_Response_Abstract $response
  123.     );
  124.  
  125.     /**
  126.      * Whether or not a given module is valid
  127.      *
  128.      * @param string $module
  129.      * @return boolean
  130.      */
  131.     public function isValidModule($module);
  132.  
  133.     /**
  134.      * Retrieve the default module name
  135.      *
  136.      * @return string
  137.      */
  138.     public function getDefaultModule();
  139.  
  140.     /**
  141.      * Retrieve the default controller name
  142.      *
  143.      * @return string
  144.      */
  145.     public function getDefaultControllerName();
  146.  
  147.     /**
  148.      * Retrieve the default action
  149.      *
  150.      * @return string
  151.      */
  152.     public function getDefaultAction();
  153. }

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

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

Copyright

© 2006-2021 by Zend by Perforce. Made with by awesome contributors.

This website is built using zend-expressive and it runs on PHP 7.

Contacts