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