第7章 Zend_Controller

目次

7.1. Zend_Controller クイックスタート
7.1.1. 導入
7.1.2. クイックスタート
7.2. Zend_Controller の基本
7.3. フロントコントローラ
7.3.1. 概要
7.3.2. 主要なメソッド
7.3.3. 環境へのアクセス用メソッド群
7.3.4. フロントコントローラのパラメータ
7.3.5. フロントコントローラのサブクラスの作成
7.4. リクエストオブジェクト
7.4.1. 導入
7.4.2. HTTP リクエスト
7.4.3. リクエストオブジェクトのサブクラスの作成
7.5. 標準のルータ: Zend_Controller_Router_Rewrite
7.5.1. 導入
7.5.2. ルータの使用法
7.5.3. 基本的な RewriteRouter の操作法
7.5.4. デフォルトのルート
7.5.5. ベース URL およびサブディレクトリ
7.5.6. ルートの型
7.5.7. RewriteRouter での Zend_Config の使用法
7.5.8. ルータのサブクラスの作成
7.6. ディスパッチャ
7.6.1. 概要
7.6.2. ディスパッチャのサブクラスの作成
7.7. アクションコントローラ
7.7.1. 導入
7.7.2. オブジェクトの初期化
7.7.3. ディスパッチ前後のフック
7.7.4. アクセス用メソッド
7.7.5. ビューの統合
7.7.6. ユーティリティメソッド
7.7.7. アクションコントローラのサブクラスの作成
7.8. アクションヘルパー
7.8.1. 導入
7.8.2. ヘルパーの初期化
7.8.3. ヘルパーブローカ
7.8.4. 組み込みのアクションヘルパー
7.8.5. 独自のヘルパーの作成
7.9. レスポンスオブジェクト
7.9.1. 使用法
7.9.2. ヘッダの操作
7.9.3. 名前つきセグメント
7.9.4. レスポンスオブジェクトのサブクラスの作成
7.10. プラグイン
7.10.1. 導入
7.10.2. プラグインの書き方
7.10.3. プラグインの使用法
7.10.4. プラグインの取得と操作
7.10.5. 標準の配布パッケージに含まれるプラグイン
7.11. モジュラーディレクトリ構造の規約の使用
7.11.1. 導入
7.11.2. モジュールコントローラディレクトリの指定
7.11.3. モジュールへのルーティング
7.11.4. モジュールあるいはグローバルのデフォルトコントローラ
7.12. MVC での例外
7.12.1. 導入
7.12.2. 例外を処理する方法は?
7.12.3. MVC で遭遇するであろう例外
7.13. 以前のバージョンからの移行
7.13.1. 0.9.3 から 1.0.0RC1 以降への移行
7.13.2. 0.9.2 から 0.9.3 以降への移行
7.13.3. 0.6.0 から 0.8.0 以降への移行
7.13.4. 0.2.0 以前のバージョンから 0.6.0 への移行

7.1. Zend_Controller クイックスタート

7.1.1. 導入

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

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

7.1.2. クイックスタート

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

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

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

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

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

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

7.1.2.3. rewrite ルールの作成

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

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

このルールは、リソース (画像やスタイルシート) 以外のすべてのリクエストをフロントコントローラに転送します。 これ以外にもフロントコントローラにまわしたくない拡張子がある場合 (PDF やテキストファイルなど) は、その拡張子を追加するなり rewrite ルールを独自に作成するなりしましょう。

[注意] 注意

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

7.1.2.4. 起動ファイルの作成

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

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

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

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

アクションコントローラについて説明する前に、まず Zend Framework でのリクエストの処理方法について知っておきましょう。 デフォルトでは、URL パスの最初の部分がコントローラ、 そしてその次の部分がアクションに対応します。たとえば URL が http://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 を開き、次の内容を入力しましょう。

<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';

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 となります。

7.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>

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

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

<?php
/** Zend_Controller_Action */
require_once 'Zend/Controller/Action.php';

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>

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

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

  • http://example.com/

  • http://example.com/index

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

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