7.9. 以前のバージョンからの移行

MVC コンポーネントの API は以前とは変更されました。 初期のバージョンから Zend Framework を使用しておられるかたは、 以下のガイドラインにしたがってスクリプトを変更し、 新しい仕組みに対応させてください。

7.9.1. 0.6.0 から 0.8.0 への移行

前回変更された、もっとも基本的な MVC コンポーネントの使用法は、そのまま同じです。

require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('/path/to/controllers');

しかし、ディレクトリ構造を見直し、いくつかのコンポーネントが削除されました。 また、名前が変更されたり新たに追加されたものもあります。以下にそれらをまとめます。

  • Zend_Controller_Router は削除されました。 かわりに rewrite ルータを使用してください。

  • Zend_Controller_RewriteRouterZend_Controller_Router_Rewrite という名前に変わり、 このフレームワークの標準ルータに格上げされました。 Zend_Controller_Front は、 特に別のルータを指定しない限りこのルータをデフォルトで使用します。

  • rewrite ルータで使用する、新しいルートクラスが追加されました。名前は Zend_Controller_Router_Route_Module です。 これは MVC で使用するデフォルトのルートのほかに、コントローラモジュール をサポートしています。

  • Zend_Controller_Router_StaticRouteZend_Controller_Router_Route_Static という名前に変わりました。

  • Zend_Controller_DispatcherZend_Controller_Dispatcher_Standard という名前に変わりました。

  • Zend_Controller_Action::_forward() の引数が変わりました。 新しいシグネチャは次のとおりです。

    final protected function _forward($action, $controller = null, $module = null, array $params = null);
    

    $action は常に必須です。 コントローラを指定しなかった場合は、 現在のコントローラ内のアクションであるとみなされます。 $controller を指定しなかった場合は、 $module は常に無視されます。 最後に、$params で指定した任意の値が リクエストオブジェクトに追加されます。 コントローラやモジュールは不要だがパラメータは渡したいという場合は、 コントローラやモジュールに null を指定します。

7.9.2. 0.2.0 以前のバージョンから 0.6.0 への移行

MVC コンポーネントの基本的な部分は変わっていません。 次のいずれの方法も使用可能です。

require_once 'Zend/Controller/Front.php';
Zend_Controller_Front::run('/path/to/controllers');
/* -- ルータを作成します -- */
$router = new Zend_Controller_RewriteRouter();
$router->addRoute('user', 'user/:username', array('controller' => 'user',
'action' => 'info'));

/* -- ルータをコントローラに設定します -- */
$ctrl = Zend_Controller_Front::getInstance();
$ctrl->setRouter($router);

/* -- コントローラのディレクトリを設定し、ディスパッチします -- */
$ctrl->setControllerDirectory('/path/to/controllers');
$ctrl->dispatch();

レスポンスオブジェクトを使用して、コンテンツとヘッダを取得することを推奨します。 これにより、アプリケーション内で より柔軟な出力書式の切り替え (たとえば XHTML ではなく JSON や XML を使用するなど) ができるようになります。 デフォルトでは、dispatch() はレスポンスのレンダリングを行い、 ヘッダとレンダリングされた内容の両方を送信します。 フロントコントローラから returnResponse() を使用してレスポンスを返し、レスポンスのレンダリングを独自に行うこともできます。 将来のバージョンのフロントコントローラでは、 レスポンスオブジェクトに出力バッファリングを使用する予定です。

これまでの API に加え、多くの機能が追加されています。 追加された機能についてはドキュメントを参照ください。

最大の変更点は、多くのコンポーネントで サブクラス化による拡張が可能になったことです。以下にポイントを整理します。

  • Zend_Controller_Front::dispatch() は、デフォルトでレスポンスオブジェクトの例外をトラップします。 例外の内容はレンダリングしません。これにより、 システムについての機密情報がレンダリングされてしまうことを防ぎます。 この挙動を変更するにはいくつかの方法があります。

    • フロントコントローラで throwExceptions() を設定します。

      $front->throwExceptions(true);
      
    • レスポンスオブジェクトで renderExceptions() を設定します。

      $response->renderExceptions(true);
      $front->setResponse($response);
      $front->dispatch();
      
      // あるいは
      $front->returnResponse(true);
      $response = $front->dispatch();
      $response->renderExceptions(true);
      echo $response;
      
  • Zend_Controller_Dispatcher_Interface::dispatch() は、ディスパッチャトークンではなく 項7.1.2. 「リクエストオブジェクト」 オブジェクトを使用するようになりました。

  • Zend_Controller_Router_Interface::route() は、ディスパッチャトークンではなく 項7.1.2. 「リクエストオブジェクト」 オブジェクトを使用するようになりました。

  • Zend_Controller_Action の変更点は以下のようになります。

    • コンストラクタが受け付ける引数は Zend_Controller_Request_Abstract $requestZend_Controller_Response_Abstract $response および array $params (optional) の三つになりました。 Zend_Controller_Action::__construct() は、これらを使用してリクエストやレスポンス、 そしてオブジェクトの invokeArgs プロパティを指定します。 コンストラクタをオーバーライドすることで、 この挙動をお望みのように変更することができます。 さらによいことに、init() メソッドを使用してインスタンスの設定を自由に行うことができます。 このメソッドは、コンストラクタでの処理の最後にコールされます。

    • run() は final メソッドではなくなりました。 しかし、このメソッドはもはやフロントコントローラでは使用されません。 これは、クラスをページコントローラとして使用する場合にのみ使用します。 オプションの引数 Zend_Controller_Request_Abstract $request および Zend_Controller_Response_Abstract $response を受け取ります。

    • indexAction() を定義する必要はなくなりました。 しかし、デフォルトのアクションとして定義しておくことを推奨します。 これにより、RewriteRouter とアクションコントローラで デフォルトのアクションメソッドを別々に指定できるようになります。

    • __call() をオーバーライドして、 未定義のアクションが自動的に処理されるようにする必要があります。

    • _redirect() にはオプションで二番目、三番目の引数が追加されました。 二番目の引数はリダイレクト時に返す HTTP コードです。 三番目の引数 $prependBase を使用すると、リクエストオブジェクトに登録したベース URL を URL の前に連結することを指示できます。

    • プロパティ _action は設定されなくなりました。 このプロパティの内容は Zend_Controller_Dispatcher_Token でしたが、これは現在のバージョンにはもう存在しません。 トークンの唯一の目的は、要求されたコントローラやアクション、 URL パラメータについての情報を提供することでした。 これらは現在はリクエストオブジェクトから次のようにして取得できるようになっています。

      // 要求されたコントローラ名を取得します。
      // その際には $this->_action->getControllerName() を使用します。
      // 以下の例では getRequest() を使用していますが、直接 $_request プロパティに
      // アクセスしてもかまいません。ただ getRequest() を使用することを推奨します。
      // とういのは、親クラスがこのメソッドをオーバーライドして挙動を変更しているかもしれないからです。
      $controller = $this->getRequest()->getControllerName();
      
      // 要求されたアクション名を取得します。
      // その際には $this->_action->getActionName() を使用します。
      $action = $this->getRequest()->getActionName();
      
      // リクエストパラメータを取得します。
      // これは変わっていません。_getParams() メソッドおよび _getParam() メソッドは
      // 現在は単なるリクエストオブジェクトへのプロキシです。
      $params = $this->_getParams();
      $foo = $this->_getParam('foo', 'default'); // パラメータ 'foo' を取得します。見つからなかった場合は
                                                 // デフォルト値 'default' を設定します。
      
      
    • noRouteAction() は削除されました。 存在しないアクションメソッドを扱うには、 __call() を使用してデフォルトのアクションに誘導します。

      public function __call($method, $args)
      {
          // 存在しない 'Action' メソッドが要求された場合に、
          // それをデフォルトのアクションに渡します。
          if ('Action' == substr($method, -6)) {
              return $this->defaultAction();
          }
          
          throw new Zend_Controller_Exception('無効なメソッド呼び出しです');
      }
      
  • Zend_Controller_RewriteRouter::setRewriteBase() は削除されました。かわりに Zend_Controller_Front::setBaseUrl() を使用してください (あるいは、リクエストクラスを使用している場合は Zend_Controller_Request_Http::setBaseUrl() を使用します)。

  • Zend_Controller_Plugin_InterfaceZend_Controller_Plugin_Abstract に置き換えられました。 すべてのメソッドは、ディスパッチャトークンではなく 項7.1.2. 「リクエストオブジェクト」 をやり取りするようになりました。