Zend Framework [3] - コントローラーって!?

2007.10.17 Author: Jas

先月から紹介を始めたZend Frameworkですが、大事な部分を紹介し忘れていました。
Zend Framework のMVC(Model - Controller - View)モデルで基本となる、コントローラのお話です。
Zend Frameworkwを紹介するには、この記事を一番に書くべきでしたね。

前回、前々回紹介したZend_HttpやZend_Mailは、システム全体からみると小さなモジュールの一部ですが、今回紹介するコントローラは、アプリケーションの全体的な制御を行っている重要なプログラムです。

コントローラはシステム全体に影響してくるので、ディレクトリ構成やシステムの設置方法も簡単に紹介したいと思います。

【ディレクトリ構成】
下記の図のように、ドキュメントルートの下にhtdocsとmoduleのディレクトリを作成します。さらにmoduleの下に、controllersとviewsディレクトリを作成、viewsの下にscriptsディレクトリを作成してください。これが、Zend Frameworkのデフォルトディレクトリ構成です。
複数のアプリケーションを設置する場合は、ルート直下に「applications」というディレクトリを追加し、その中に「htdocs」と「module」を設置することになります。

directory.jpg


【設置】
1.フロントコントローラ
まず、index.phpと.htaccessを作成し、htdocsの中に設置します。
.htaccessは、マニュアルを参考に記載してください。
index.phpは、起動ファイルと呼び、これがすべてのリクエストを受け取ります。

デフォルトの場合は簡単で、index.phpは以下の2行を書くだけです。
( './controllers' には、controllersディレクトリへのパス)

<?php
// フロントコントローラを読み込み
require_once 'Zend/Controller/Front.php';

// お手軽版フロントコントローラ
Zend_Controller_Front::run( './controllers' );

ただし、ルート直下にhtdocsを配置していない場合(http://host/~user/など)は、お手軽版フロントコントローラは利用できません。Zend Frameworkは、ベースURL(http://host/)の後にスラッシュ区切りでパラメータを追加し、それに基づいて処理の委譲を行っているからです。

サブドメインの指定がしてある場合などには、index.phpでベースURLを指定してあげると動きます。
(必要に応じて、.htaccessのRewriteBaseも指定してください)

<?php
require_once 'Zend/Controller/Front.php';
require_once 'Zend/Controller/Router/Rewrite.php';

// ルーティングとフロントコントローラ
$router = new Zend_Controller_Router_Rewrite();
$ctrl = Zend_Controller_Front::getInstance();

// コントローラディレクトリとベースURLの指定
$ctrl->setControllerDirectory('./controllers')
->setRouter($router)
->setBaseUrl('/~user');

// ディスパッチ
$ctrl->dispatch();

これでフロントコントローラの準備は完了です。


2.アクションコントローラ
次に、実際の処理を行うアクションコントローラを作成し、module/controllers/の中に設置します。
アクションコントローラの名前は、IndexController.phpやUserContoroller.php等のように、「コントローラ名 + Controller.php」でなければなりません。

コントローラの中にはいくつかのアクションが存在しますが、必ずデフォルトアクションが含まれていなければなりません。また、アクション名は、indexAction()のように、「アクション名 + Action」でなければなりません。

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

class IndexController extends Zend_Controller_Action {
// indexアクション(デフォルトアクション)
public function indexAction() {
// 処理の内容
}
}

アクションコントローラは、デフォルトでアクション名と同じテンプレートを出力してくれるので、上記のスクリプトだけでも動きます。このコードをIndexController.phpという名前で、controllersディレクトリに保存します。

3.テンプレート
最後に、出力されるhtmlのテンプレートをscriptsディレクトリ下に設置します。
例えば、IndexControllerのindexActionが呼び出された場合には、scripts/index/index.phtmlが出力されます。

このテンプレートは普通にHTMLで書きます。ただし、設置場所やファイル名が間違っているとエラーになるので注意しましょう。


【動作チェック】
フロントコントローラの説明のときに、ベースURLの後にスラッシュ区切りでパラメータを追加すると書きました。パラメータの順序は決まっていて、http://host/contoroller/action/key/value/ です。例えば、URLが http://www.conextivo.com/blog/read/ のときには、blogコントローラのreadアクションで処理が行われます。

記事中で紹介したようなディレクトリ構成で、index.phpとIndexController.php、index.phtmlを設置していれば、http://host/index/index/ にアクセスするとindexテンプレートの内容が出力されます。
また、http://host/ だけでも同じページが表示できます。これは、indexがデフォルトになっているためです。

【参考】
Zend Framework リファレンスガイド
http://framework.zend.com/manual/ja/zend.controller.html

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ