# Zend_Controller クイックスタート

## 導入

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

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

## クイックスタート

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

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

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

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

### ドキュメントルートの設定

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

### 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 用のものです。 その他のウェブサーバ用の例については ルータのドキュメント を参照ください。

### 起動ファイルの作成

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

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

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

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

アクションコントローラについて説明する前に、まず 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` を開き、次の内容を入力しましょう。

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

### ビュースクリプトの作成

先ほど説明したように、ビュースクリプトの場所は `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>

### エラーコントローラの作成

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

    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>

### 実際に見てみましょう!

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

- `http://example.com/`

- `http://example.com/index`

- `http://example.com/index/index`

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