ZendFramework入門・その1 メッセージを表示するアプリケーションを作ってみる2007年08月29日 03時28分49秒

はじめの一歩 - メッセージを表示してみる

前回の準備編でZend Frameworkの環境は整ったので、ものすごく簡単なアプリケーションから作ってみます。アプリケーションルートを「zf1」とします。

ディレクトリ構成

まずはディレクトリ構成。ドキュメントルート直下にフォルダ「zf1」を作成し、その下に「application」を作成します。さらに「application」下に「controllers」「views」を作成、「views」下に「index」を作成してください(結構面倒くさいでしょ?)。フォルダの名前に注意してください。特に「views」は、暗黙で参照される名前ですので、末尾の「s」が抜けていたりなどスペルミスがあるといきなり「ファイルが見つからない」エラーになってしまいます。

※:2014-04-08 説明文中の「applications」を「application」に修正しました。コメントでのご指摘、ありがとうございました。

ドキュメントルートからのツリーは以下のようになります。

  • htdocs/
    • zf1/
      • application/
        • controllers/
        • views/
          • scripts/
            • index/

index.phpを作成する

まずはURLリライトで必ず呼び出されるようにする「index.php」を作成します。このスクリプトがすべてのリクエストを処理することになります。

zf1の下に以下の内容でindex.phpを作成してください。

<?php
// エラーを表示するようにしておく
ini_set( 'display_errors', 1 );

// フロントコントローラをrequire
require_once 'Zend/Controller/Front.php';

// ルーティング&ディスパッチ開始
Zend_Controller_Front::run( './application/controllers' );

index.php
ここで行っているのは、以下の3つの処理です。
  • ini_set()でエラーをブラウザへ表示するように設定(デバッグ向け)
  • フロントコントローラクラスのソースをrequire
  • ルーティング&ディスパッチ処理の開始

フロントコントローラ?

いきなり、あたりまえのように「フロントコントローラ」と言われてもなんのことかわからないかも知れませんので、簡単に説明します。

Zend Frameworkのリクエスト処理は、「フロントコントローラがリクエストを受け付けて、ルータに行き先(ディスパッチ先)を決めさせ、決定した行き先(アクションコントローラ)へディスパッチャを介して処理を委譲する」という流れになります。さらに用語が増えていますが^^;、順次解説していきますので、とりあえずは気にせず「こんな用語があるんだ」程度に考えていてください。

この「フロントコントローラ」が、コード中に記述されている「Zend_Controller_Front」で、このクラスは「Zend/Controller/Front.php」で定義されています。

命名規則

こうしてクラス名とファイル名を並べてみるとちょっとしたことに気づくかもしれません。Zend Frameworkのクラスとそれを定義するファイル名は単純なルールで決められています。

フロントコントローラ「Zend_Controller_Front」のアンダースコアをパス区切りに置き換え、末尾に「.php」を補うと、インクルードパスを基点にしたファイルパスになります。当然ファイルパスのパスセパレータをアンダースコアに置き換えて「.php」を取り除くとクラス名になります。

もう少し例を見てみましょう。ここではまだ使用しませんが、データベースのテーブルを取り扱うための「Zend_Db_Table」という抽象クラスがありますが、これは「Zend/Db/Table.php」で定義されています。さらにこれの派生元になっている「Zend_Db_Table_Abstract」抽象クラスは「Zend/Db/Table/Abstract.php」で定義されています。

これらのルールを把握していれば、あるクラスを使用するためにrequireしなければならないファイルパスがすぐわかると思います。このルールを適用するために、準備編でインクルードパスの設定をしていた、というわけです。

アクションコントローラを作成する

さて、いささか話がそれましたが、続けてコードを作成していきます。上記のindex.phpでは委譲先を決定して呼び出すところまでは行ってくれますが、肝心の委譲先がない状態ですので当然ながらエラーになります。ですので、次のステップでは処理の委譲先であるアクションコントローラを作成します。

アクションコントローラは、フロントコントローラから開始されたディスパッチ処理の流れの中で、実際に要求を処理するための「アクション」を担当します。

アクションコントローラの命名規則

アクションコントローラにも命名規則があり、

  • クラス名はCamelCase形式で「コントローラ名」とサフィックス「Controller」で構成する必要がある。
  • アクションメソッド(実際にディスパッチ処理で呼び出されるメソッド)はcamelCase形式で、「アクション名」とサフィックス「Action」で構成する必要がある。
  • ファイル名はクラス名+.phpである必要がある。
というルールに従う必要があります。

コントローラとアクションの決定

またちょっと横道にそれますが、「コントローラ名」と「アクション名」という用語がでてきましたが、それがどのように決定されるかわからないかもしれません。

これらの情報はリクエストに含まれることになります。今回のアプリケーション「zf1」に対するリクエストURLが「http://<host名>/zf1/index/test」だったとすると、アプリケーションのルートになるURLは「http://<host名>/zf1/」で、そのあとの「index」がコントローラ名、最後の「test」がアクション名になります(さらにこの後ろに「<パラメータ名>/<パラメータ値>」という形式でGETのパラメータを渡すようになります)。

このリクエストを処理するのが「IndexController」(コントローラ名の先頭を大文字にします)に実装された「testAction」メソッド、ということになります。

また、リクエストでアクション名が省略された場合は「index」アクション、コントローラ名が省略された場合は「index」コントローラが指定されたものとみなされます。つまり、「http://<host名>/zf1/」(コントローラ・アクションとも省略)も「http://<host名>/zf1/index/」(アクションのみ省略)も「http://<host名>/zf1/index/index/」が指定されたことになります。

アクションコントローラの実装

これらの知識を元に、最低限のアクションコントローラを作成してみましょう。デフォルトの「IndexController」です。

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

// IndexController
class IndexController extends Zend_Controller_Action {
	// indexアクション
	public function indexAction() {
		// アクションに必要なコードをここに記述します。
	}
}
IndexController.php
本当に「とりあえず」といったコードですが、これをzf1下の application/controllers/IndexController.phpとして保存してください。

ビュースクリプトの作成

ここまでの長々とした説明でようやく「index.php」、「application/controllers/IndexController.php」の2つのファイルを作成しましたが、これだけではまだ動作させられません。「あぁ、もううんざり」と思うかもしれませんが、あと少しだけお付き合いください(^^;。

ビュースクリプトとは

実はここまでではまだ「MVC」の「C」の部分しか取り扱っていません。「M」(モデル)の部分はデータベース周りのことになるのでまた後ほどにしておくとして、あとは「V」、つまりビューを取り扱う必要があります。

Zend Frameworkでビューを扱うのは、そのまんまの名前の「Zend_View」になります。

実は、アクションコントローラはデフォルトでZend_Viewのインスタンスを与えられており、パブリックプロパティ「view」を介して値を「assign」することによりZend_Viewに出力させたいデータを渡すことができます。

そしてアクションコントローラがなにも支持をしなくても、Zend_Viewはディスパッチ処理が完了すると命名規則に従ったビュースクリプトを自動的に実行して、コントローラからassignされたデータをレンダリングするようになっています。

ビュースクリプトの命名規則

ここで、最初にあげたディレクトリ構成を見直してみてください。zf1/applicationの下に「views/scripts」というディレクトリを用意しています。これが先にあげた「命名規則」に従ったパスの基点で、この下にさらにコントローラ名に一致する名前のディレクトリを作成し、その中にアクション名に一致するビュースクリプトファイルを設置することで、ようやくリクエストを処理してブラウザへ表示することができるようになります。(面倒くさいですか?dara-jは面倒くさいと思います。全力で。)

ビュースクリプトの実態

ビュースクリプトファイルは、HTMLファイルにPHPコードを埋め込んだ、ある意味典型的なPHPファイルです。ただし、いくつかの注意点があります。

  • ファイルの拡張子は「.phtml」にする必要がある。
  • 実行時はアクションコントローラに関連付けられたZend_Viewのコンテキストで動作する。
1点目は実際にはカスタマイズ可能なのですが、フロントコントローラから開始される一連の流れではデフォルトの設定をそのまま使用したほうがよいので、この入門記事中ではビュースクリプトの拡張子は常に.phtmlにします。

2点目はどういうことかというと、ビュースクリプト中で「$this」を参照するとそれがZend_Viewのインスタンスである、ということです。具体的には以下のコードで説明しますが、アクションメソッド内から「$this->view->assign('hoge', 'hoge');」とすると、そのアクションに対応するビュースクリプト内からは「$this->hoge」にアクセスでき、その値が'hoge'になる、といった使い方をします。

ようやく実装

さて、ようやくコードです。まずは先ほどのIndexController.phpを修正します。indexActionメソッドを以下のようにしてみましょう。

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

// IndexController
class IndexController extends Zend_Controller_Action {
	// indexアクション
	public function indexAction() {
		// 変更箇所。Zend_Viewの「message」に「ようこそ Zend Frameworkへ」を割り当てる
		$this->view->assign( 'message', 'ようこそ Zend Frameworkへ' );
	}
}
IndexController.php(改訂版)
そしてビュースクリプトです。今回はIndexControllerのindexActionなので、application/views/scripts/index/index.phtml を作成します。HTMLとしての記述は思い切り端折っていますので、気になるようでしたら補完してください。
<html>
<head>
	<title>zf1/index/index</title>
</head>
<body>
	<h3>
		<?php echo $this->message;  ?>
	</h3>
</body>
</html>
index.phtml

これでようやく今回作成するファイルが出揃いました。最終的にツリー構成は以下のようになります。

  • htdocs/
    • zf1/
      • application/
        • controllers/
          • IndexController.php
        • views/
          • scripts/
            • index/
              • index.phtml
      • index.php

zf1へブラウザでアクセスして、「ようこそ Zend Frameworkへ」が表示されればOKです。

次回の予定

ようやく最小限の構成ができたわけですが、単独のアクションを実装しただけではまったく意味がありません。次回は複数のアクションメソッドの実装を中心に、エラーを処理するコントローラについても触れたいと考えています。

参考資料

今回触れたZend_Controller周りの詳細を知りたいのでしたら、ぜひリファレンスガイドに目を通してください。

またもこっそり訂正 (07.08.29 11:35)

PHPの開始タグの「?」を忘れたり、開始タグそのものを忘れたりしてたので訂正しました。

さらにこっそり訂正(07.08.31 00.53)

h3タグの閉じミスとビュースクリプト中のPHP閉じタグの記述ミスを修正しました。あかんなぁ...

さらにさらにこっそり訂正(07.09.03 02:24)

フォルダツリーでビュースクリプトのツリー構成から1階層抜けていたため、追加しました。正しくは「views/scripts/index/」になります。

コメント

_ (未記入) ― 2014年03月04日 10時27分50秒

『ドキュメントルート直下にフォルダ「zf1」を作成し、その下に「applications」を作成します。』となっていますが、applicationが正しいのでは? 間違っていたらすみません(ノ∀`)

_ dara-j ― 2014年04月08日 20時45分36秒

コメントありがとうございます&1ヶ月以上も放置してごめんなさい!!
> applicationが正しいのでは?
ご指摘の通りです^^; 直しておきます…

_ kitsune_iro ― 2015年04月03日 18時59分27秒

このようなページを作成していただいて、とてもありがとうございます。
業務でZend Frameworkに接しなくてはならなくて、でも挫折するばかりで困っておりました。
すみません、一つだけ。前ページを見ればわかったことなのですが、".htaccess"の設置が書いていなかったので、少しハマりました。見当違いな指摘だったらすみません。

_ dara-j ― 2015年05月21日 01時05分45秒

kitsune_iro さん、コメントありがとうございます。長期間放置ですみませんでした。

> ".htaccess"の設置が書いていなかったので、

ご指摘ありがとうございます。
準備編を参照してもらうつもりでこちらには書いてなかったんですが、なるほどわかりづらかったですね。

折りを見て修正しておきます。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://dara-j.asablo.jp/blog/2007/08/28/1756022/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。