7.9. 以前のバージョンからの移行
前のページ | 第7章 Zend_Controller | 次のページ

## 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_RewriteRouter` は `Zend_Controller_Router_Rewrite` という名前に変わり、 このフレームワークの標準ルータに格上げされました。 `Zend_Controller_Front` は、 特に別のルータを指定しない限りこのルータをデフォルトで使用します。

- rewrite ルータで使用する、新しいルートクラスが追加されました。名前は `Zend_Controller_Router_Route_Module` です。 これは MVC で使用するデフォルトのルートのほかに、項7.7. 「モジュラーディレクトリ構造の規約の使用」 をサポートしています。

- `Zend_Controller_Router_StaticRoute` は `Zend_Controller_Router_Route_Static` という名前に変わりました。

- `Zend_Controller_Dispatcher` は `Zend_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 $request`、 `Zend_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_Interface` は `Zend_Controller_Plugin_Abstract` に置き換えられました。 すべてのメソッドは、ディスパッチャトークンではなく 項7.1.2. 「リクエストオブジェクト」 をやり取りするようになりました。

前のページ | 上に戻る | 次のページ
7.8. MVC での例外 | ホーム | 第8章 Zend_Date