第12章 Zend_Controller

目次

12.1. Zend_Controller クイックスタート
12.1.1. 導入
12.1.2. クイックスタート
12.1.2.1. ファイルシステムレイアウトの作成
12.1.2.2. ドキュメントルートの設定
12.1.2.3. rewrite ルールの作成
12.1.2.4. 起動ファイルの作成
12.1.2.5. デフォルトのアクションコントローラの作成
12.1.2.6. ビュースクリプトの作成
12.1.2.7. エラーコントローラの作成
12.1.2.8. 実際に見てみましょう!
12.2. Zend_Controller の基本
12.3. フロントコントローラ
12.3.1. 概要
12.3.2. 主要なメソッド
12.3.2.1. getInstance()
12.3.2.2. setControllerDirectory() および addControllerDirectory
12.3.2.3. addModuleDirectory() および getModuleDirectory()
12.3.2.4. dispatch()
12.3.2.5. run()
12.3.3. 環境へのアクセス用メソッド群
12.3.4. フロントコントローラのパラメータ
12.3.5. フロントコントローラの継承
12.4. リクエストオブジェクト
12.4.1. 導入
12.4.2. HTTP リクエスト
12.4.2.1. リクエストデータへのアクセス
12.4.2.2. ベース URL およびサブディレクトリ
12.4.2.3. リクエストメソッドの判定
12.4.2.4. AJAX リクエストの検出
12.4.3. リクエストオブジェクトのサブクラスの作成
12.5. 標準のルータ
12.5.1. 導入
12.5.2. ルータの使用法
12.5.3. 基本的な RewriteRouter の操作法
12.5.4. デフォルトのルート
12.5.5. ベース URL およびサブディレクトリ
12.5.6. グローバルパラメータ
12.5.7. ルートの型
12.5.7.1. Zend_Controller_Router_Route
12.5.7.1.1. 変数のデフォルト
12.5.7.1.2. 変数の制約
12.5.7.1.3. 翻訳済みセグメント
12.5.7.2. Zend_Controller_Router_Route_Static
12.5.7.3. Zend_Controller_Router_Route_Regex
12.5.7.4. Zend_Controller_Router_Route_Hostname
12.5.7.5. Zend_Controller_Router_Route_Chain
12.5.7.5.1. Zend_Configを介したルートのチェーン
12.5.7.6. Zend_Rest_Route
12.5.7.6.1. Zend_Rest_Controller
12.5.8. RewriteRouter での Zend_Config の使用法
12.5.9. ルータのサブクラスの作成
12.6. ディスパッチャ
12.6.1. 概要
12.6.2. ディスパッチャのサブクラスの作成
12.7. アクションコントローラ
12.7.1. 導入
12.7.2. オブジェクトの初期化
12.7.3. ディスパッチ前後のフック
12.7.4. アクセス用メソッド
12.7.5. ビューの統合
12.7.5.1. ビューの初期化
12.7.5.2. ビューのレンダリング
12.7.6. ユーティリティメソッド
12.7.7. アクションコントローラのサブクラスの作成
12.8. アクションヘルパー
12.8.1. 導入
12.8.2. ヘルパーの初期化
12.8.3. ヘルパーブローカ
12.8.4. 組み込みのアクションヘルパー
12.8.4.1. ActionStack
12.8.4.2. AutoComplete
12.8.4.2.1. Dojo でのオートコンプリート
12.8.4.2.2. Scriptaculous でのオートコンプリート
12.8.4.3. ContextSwitch および AjaxContext
12.8.4.3.1. デフォルトで使用できるコンテキスト
12.8.4.3.2. 独自のコンテキストの作成
12.8.4.3.3. アクションごとのコンテキストの設定
12.8.4.3.4. コンテキストスイッチの初期化
12.8.4.3.5. 追加機能
12.8.4.3.6. AjaxContext の機能
12.8.4.4. FlashMessenger
12.8.4.4.1. 導入
12.8.4.4.2. 基本的な使用例
12.8.4.5. JSON
12.8.4.6. Redirector
12.8.4.6.1. 導入
12.8.4.6.2. 基本的な使用例
12.8.4.7. ViewRenderer
12.8.4.7.1. 導入
12.8.4.7.2. API
12.8.4.7.3. 基本的な使用例
12.8.4.7.4. 高度な使用例
12.8.5. 独自のヘルパーの作成
12.9. レスポンスオブジェクト
12.9.1. 使用法
12.9.2. ヘッダの操作
12.9.3. 名前つきセグメント
12.9.4. レスポンスオブジェクト内での例外の検査
12.9.5. レスポンスオブジェクトのサブクラスの作成
12.10. プラグイン
12.10.1. 導入
12.10.2. プラグインの書き方
12.10.3. プラグインの使用法
12.10.4. プラグインの取得と操作
12.10.5. 標準の配布パッケージに含まれるプラグイン
12.10.5.1. ActionStack
12.10.5.2. Zend_Controller_Plugin_ErrorHandler
12.10.5.2.1. 404 ハンドラとしての ErrorHandler の使用
12.10.5.2.2. 前回のレンダリング結果の扱い
12.10.5.2.3. プラグインの使用例
12.10.5.2.4. エラーコントローラの例
12.10.5.3. Zend_Controller_Plugin_PutHandler
12.11. モジュラーディレクトリ構造の規約の使用
12.11.1. 導入
12.11.2. モジュールコントローラディレクトリの指定
12.11.3. モジュールへのルーティング
12.11.4. モジュールあるいはグローバルのデフォルトコントローラ
12.12. MVC での例外
12.12.1. 導入
12.12.2. 例外の処理
12.12.3. MVC で遭遇するであろう例外
12.13. 以前のバージョンからの移行
12.13.1. 1.7.x から 1.8.0 以降への移行
12.13.1.1. 標準のルートの変更
12.13.2. 1.6.x から 1.7.0 以降への移行
12.13.2.1. ディスパッチャインターフェイスの変更
12.13.3. 1.5.x から 1.6.0 以降への移行
12.13.3.1. ディスパッチャインターフェイスの変更
12.13.4. 1.0.x から 1.5.0 以降への移行
12.13.5. 0.9.3 から 1.0.0RC1 以降への移行
12.13.6. 0.9.2 から 0.9.3 以降への移行
12.13.7. 0.6.0 から 0.8.0 以降への移行
12.13.8. 0.2.0 以前のバージョンから 0.6.0 への移行

12.1. Zend_Controller クイックスタート

12.1.1. 導入

Zend_Controller は、Zend Framework の MVC システムの中心となるものです。MVCモデル-ビュー-コントローラ の頭文字をとったもので、アプリケーションのロジックと表示ロジックを分離させる設計手法です。 Zend_Controller_Front フロントコントローラ パターンを実装しており、 すべてのリクエストをいったんフロントコントローラで受け取った上でその URL にもとづいたアクションコントローラに配送します。

Zend_Controller は、拡張性を考慮して作成されています。 拡張の方法としては、既存のクラスのサブクラスを作成する方法と アクションヘルパーを作成する方法があります。 新しいサブクラスを作成すると、コントローラクラスの基盤となる インターフェイスや機能を新たに書くことができます。 アクションヘルパーを使用すると、システムの機能を強化したり変更したりできるようになります。

12.1.2. クイックスタート

より詳しい情報が知りたい場合は、次のセクションを参照ください。 とりあえず動かしてみたいという方は、ここを読むといいでしょう。

12.1.2.1. ファイルシステムレイアウトの作成

まずはディレクトリ構成を決めましょう。 典型的なレイアウトは、次のようなものです。

application/
    controllers/
        IndexController.php
    models/
    views/
        scripts/
            index/
                index.phtml
        helpers/
        filters/
html/
    .htaccess
    index.php

12.1.2.2. ドキュメントルートの設定

ウェブサーバのドキュメントルートを、先ほどのレイアウト中の html/ ディレクトリに設定します。

12.1.2.3. rewrite ルールの作成

上のレイアウトの html/.htaccess ファイルを、次のように編集します。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
[注意] mod_rewrite について

上のリライトルールは、バーチャルホストのドキュメントルート配下にある すべてのファイルへのアクセスを許可するものです。 この方式で公開してしまってはまずいファイルがある場合は、 このルールにさらに制約を追加しなければなりません。 Apache のウェブサイトにいけば、 mod_rewrite について もっと詳しく知ることができます。

IIS 7.0 をお使いの場合は、次のような rewrite 設定を使用します。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
     <system.webServer>
         <rewrite>
             <rules>
                 <rule name="Imported Rule 1" stopProcessing="true">
                     <match url="^.*$" />
                     <conditions logicalGrouping="MatchAny">
                         <add input="{REQUEST_FILENAME}"
                             matchType="IsFile" pattern=""
                             ignoreCase="false" />
                         <add input="{REQUEST_FILENAME}"
                             matchType="IsDirectory"
                             pattern="" ignoreCase="false" />
                     </conditions>
                     <action type="None" />
                 </rule>
                 <rule name="Imported Rule 2" stopProcessing="true">
                     <match url="^.*$" />
                     <action type="Rewrite" url="index.php" />
                 </rule>
             </rules>
         </rewrite>
     </system.webServer>
</configuration>

このルールは、既存のリソース (シンボリックリンク、空でないファイル、あるいは空でないディレクトリ) へのリクエストを適切に転送し、 それ以外のすべてのリクエストをフロントコントローラに転送します。

[注意] 注意

上の rewrire ルールは Apache 用のものです。 その他のウェブサーバ用の例については ルータのドキュメント を参照ください。

12.1.2.4. 起動ファイルの作成

起動ファイルとはすべてのリクエストの転送先となるファイルのことで、 今回の例では html/index.php がそれにあたります。 html/index.php をお好みのエディタで開き、次の内容を追加します。

Zend_Controller_Front::run('/path/to/app/controllers');

これは、フロントコントローラのインスタンスとディスパッチを行います。 この結果、アクションコントローラへリクエストが転送されます。

12.1.2.5. デフォルトのアクションコントローラの作成

アクションコントローラについて説明する前に、まず Zend Framework でのリクエストの処理方法について知っておきましょう。 デフォルトでは、URL パスの最初の部分がコントローラ、 そしてその次の部分がアクションに対応します。たとえば URLhttp://framework.zend.com/roadmap/components である場合、パスは /roadmap/components となり、これは roadmap コントローラの components アクションに対応します。 アクションを省略した場合は index アクションであるとみなされます。 またコントローラを省略した場合は index コントローラであるとみなされます (Apache が自動的に DirectoryIndex に対応させるという規約に従っています)。

Zend_Controller のディスパッチャは、 コントローラを対応するクラスに関連付けます。 デフォルトでは、コントローラ名の先頭を大文字にしたものに Controller をつなげたものがクラス名となります。 つまり、上の例では roadmap コントローラが RoadmapController クラスに対応することになります。

同様に、アクションもコントローラクラスのメソッドに関連付けます。 デフォルトでは、アクション名を小文字に変換して Action を追加したものがメソッド名となります。 つまり、上の例では components アクションは componentsAction() メソッドになり、最終的に RoadmapController::componentsAction() がコールされることになります。

続いて、デフォルトのアクションコントローラと アクションメソッドを作ってみましょう。 先ほど説明したように、デフォルトのコントローラ名およびアクション名はどちらも index となります。 application/controllers/IndexController.php を開き、次の内容を入力しましょう。

/** Zend_Controller_Action */
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
    }
}

デフォルトでは ViewRenderer アクションヘルパーが有効になります。つまり、 アクションメソッドとそれに対応するビュースクリプトを用意すれば、 すぐにその内容をレンダリングできるというわけです。 デフォルトでは、MVC のビュー層として Zend_View を使用します。 ViewRenderer は、コントローラ名 (たとえば index) とアクション名 (たとえば index) から処理するテンプレートを決定します。 デフォルトでは、テンプレートの拡張子は .phtml となります。つまり、上の例では index/index.phtml をレンダリングします。 さらに ViewRenderer は、 コントローラと同一階層にある views/ ディレクトリを自動的にビューの基底ディレクトリとみなし、 views/scripts/ ビュースクリプトがおかれるものと考えます。 したがって、実際にレンダリングされるテンプレートは application/views/scripts/index/index.phtml となります。

12.1.2.6. ビュースクリプトの作成

先ほど説明したように、ビュースクリプトの場所は application/views/scripts/ です。 デフォルトコントローラにおけるデフォルトのアクションのビュースクリプトは application/views/scripts/index/index.phtml となります。このファイルを作成し、何か HTML を入力してみましょう。

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>My first Zend Framework App</title>
</head>
<body>
    <h1>Hello, World!</h1>
</body>
</html>

12.1.2.7. エラーコントローラの作成

デフォルトで、 エラーハンドラプラグイン が登録されています。 このプラグインを使用するには、エラー処理用のコントローラが必要です。 デフォルト設定では、デフォルトモジュールの ErrorControllererrorAction() というメソッドがあることを想定しています。

class ErrorController extends Zend_Controller_Action
{
    public function errorAction()
    {
    }
}

先ほど説明したディレクトリ構成により、このファイルは application/controllers/ErrorController.php に配置されることになります。これとは別に、ビュースクリプト application/views/scripts/error/error.phtml が必要です。その中身は、たとえば次のようになるでしょう。

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>エラー</title>
</head>
<body>
    <h1>エラーが発生しました</h1>
    <p>エラーが発生しました。後ほどもう一度お試しください。</p>
</body>
</html>

12.1.2.8. 実際に見てみましょう!

ここまでくれば、実際にブラウザでサイトを表示してみることができます。 あなたのドメインが example.com だとすると、 以下のいずれかの URL で先ほど作成したページが表示されることでしょう。

  • http://example.com/

  • http://example.com/index

  • http://example.com/index/index

これで、実際にコントローラやアクションを作成する準備ができました。 おめでとうございます!