ZendFramework入門・準備編 Zend Frameworkの動作環境を作る2007年08月28日 02時53分30秒

突然入門記事を書いてみたり

えー、なにを思ったか、Zend Frameworkの入門記事を書いてみたいと思います。とりあえずの第一段階として、Zend Framework標準のMVCアーキテクチャを使用して、フォームの内容をDBに書き込んであとで検索できるような簡単なメモアプリを作ることを目標にしようと思います。

dara-jにそんなスキルがないので、PHPやオブジェクト指向プログラミングの詳しい解説は省略させていただきます。前提として

  • PHPをある程度使える(他人のソースをほんのちょっと改造できる程度)
  • クラスベースのオブジェクト指向プログラミングをかじったことがある
くらいのスキルがあるものとさせていただきます。(とはいっても、掲載コードにはなるべく解説をいれるつもりですが)

必要な環境

Zend Frameworkでアプリケーションを作成・動作させるには以下のような環境が必要になります。

  • PHP(5.1.4以降): Zend FrameworkはPHP5のオブジェクト指向機能を利用しているため5.1.4またはそれ以降のPHP環境が必要になります。
  • URLリライト機能があるWebサーバ:Apacheであればmod_rewriteを有効にすれば問題ありません、IISでもISAPI Rewriteを使用すればZend Frameworkを動作させることができます。
  • テキストエディタ:ソースコードの編集に必要です。本当はPDTのようにコード補完機能が利用できるIDEがあればいいのですが、ここで取り扱う規模なら手になじんだテキストエディタで十分でしょう。
  • Web ブラウザ:Webアプリケーションを作るので、当然ながら動作確認にブラウザが必要です。

インストール

まずはPHPとWebサーバをインストールする必要がありますが、ここでは省略します。検索すれば有用な記事がたくさん見つかると思うのでそれらを参考にして、PHPが動作する環境を作ってください。

PHPが正常に動作する環境が確保できたら、Zend Frameworkをダウンロードします。こちらのダウンロードページからダウンロードしてください。

※:この記事を書いている2007年 8月 28日時点では、1.0.1が最新バージョンです。この記事は1.0.0をベースに進めますがバージョン間の相違はおそらくないのでどちらでも問題ないと思います。

1.0.0(または1.0.1)のアーカイブをダウンロード・解凍すると、以下のようなディレクトリ構成になっているはずです。

  • ZendFramework-1.0.x/ → ルートフォルダ
    • demos/ → デモアプリケーションフォルダ。この連載では使用しません
    • incubator/ → 正式のライブラリになる前の実験的(?)なライブラリ郡があります。この連載では使用しません
    • library/ → ライブラリのルートフォルダ
    • tests/ → テストスクリプトフォルダ。この連載では使用しません
ルートフォルダ(ZendFramework-1.0.x)、または/libraryフォルダを任意の場所に設置してください。ただし、後述しますがlibraryフォルダをPHPのインクルードパスに追加する必要があるため、ドライブのルートに設置したほうが楽でしょう。たとえばD:\ZendFramework-1.0.0、のように。

URLリライトの動作確認

ZendFrameworkの設定と動作確認の前に、URLリライトの設定と動作確認をとってみましょう。Apacheを使用しているのであれば、書き換え対象のフォルダに以下のようにルールを記述した.htaccessを設置するだけですみます。

RewriteEngine on

RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
これは、「.js、.ico、.gif、.jpg、.png、.css以外の名前のパスをすべてindex.phpにリライトする」というルールです。Zend Framework(性格にはZend_Controller_*を使用したMVCモデル)では、このようにすべてのリクエストをアプリケーションルートのindex.phpに処理させるようにします。

今回は、ドキュメントルート下に「rewrite_test」というフォルダを切って、これを確認用のURLのルートにします。ドキュメントルートを「D:\htdocs」にした場合、以下のようなファイル配置になります。(ごめんなさい、Windows前提です。linuxなどは適当にルートやパス区切りを読み替えてください)

  • D:\
    • htdocs/
      • rewrite_test/
        • .htaccess → ここにリライトルールを記述
        • index.php → 画像ファイルとJavaScript、スタイルシート以外へのアクセスはすべてここに集約される
        • test.html → ダミーで設置
index.phpの内容は以下のような簡単なものにしてみましょう。
<?php
echo 'hello, Zend Framework !';

この状態で/rewrite_test/test.html(ダミーファイルへのURL)へアクセスして、「hello, Zend Framework !」と表示されれば、URLリライトの機能は正常です。もしtest.htmlが表示されるようであれば、Apacheの設定でmod_rewriteがONになっているか再度確認してください。

IIS + ISAPI Rewriteの場合

IIS + ISAPI Rewriteの環境の場合はApacheよりもちょっとだけ面倒です。ルールの記述はISAPI Rewriteのインストールディレクトリにある「httpd.ini」に記述する必要があります。さらに書式もちょっと面倒です。上記環境の場合は以下のようになります。

[ISAPI_Rewrite]
RewriteRule ^/rewrite_test/[\w/\%]*(?:\.(?!(?:js|ico|gif|jpg|png|css)$)[\w\%]*$)? /rewrite_test/index.php [I]
これ以降、アプリケーションフォルダを切るたびに対象のパスに対する同様の記述をhttpd.iniへ追加していく必要があります。まぁ、コピーペーストでパスだけ書き換えればいいのですが。

インクルードパスの設定

URLリライト機能の確認ができたら、Zend FrameworkのlibraryフォルダをPHPのインクルードパスに設定します。たとえば、アーカイブを解凍したルートフォルダごと、Dドライブ直下に設置した(つまり、D:\ZendFramework-1.0.0 になっている)場合は、PHP.iniのinclude_pathを以下のように設定します。

; Windows向けの例
include_path ".;D:\ZendFramework-1.0.0\library"
もし、他のライブラリを常用するのであればそちらのパスも忘れずに記述しておいてください。

PHP.iniを書き換えたら、CGIモードでない限りは設定を反映させるためWebサーバを再起動する必要があります。

いよいよZend Frameworkのライブラリを使ってみる

インクルードパスが正しく設定されていれば、Zend Frameworkのライブラリにあるクラス郡を使用できます。先ほどのindex.phpを以下のように変更してみましょう。

<?php
// Zend_Version クラスをrequireする。
require_once 'Zend/Version.php';

// Zend Frameworkのバージョン情報をechoする
echo 'hello, Zend Framework ! version = ' . Zend_Version::VERSION;
/rewrite_test/index.php にアクセスして、「hello, Zend Framework ! version = 1.0.0」と表示されれば成功です。

もしrequire_onceでWarningがあがるようならインクルードパスが適切に設定されていません。PHP.iniをもう一度見直してみてください。

これでZend Frameworkの環境ができあがりました。次回からはもう少しプログラミングっぽくしていこうと思います。

あとがき

dara-jは全然PHPerではないのですが、現在とっかかってる仕事がZend Frameworkを使用しているので、日々PHPやZend Frameworkと格闘しています。

いまではそこそこ慣れたのですが、使い始めのころはZend Frameworkの「プログラマ向けリファレンスガイド」と首っ引きでした。もちろん、このリファレンスガイドとAPIドキュメントがあれば大体のことは網羅されていますし、当然ソースコードも公開されているのでそちらを追いかければより詳細な仕様を確認できるのですが、とっかかりとしては敷居が高く、かなりうなりながらドキュメントを読んでいたように思います。

「PHPフレームワークの本命」と言われている割に、検索をしてみてもあまりまとまった入門記事にあたらないように思います。ITmediaの記事や、IBM developerWorksの記事もありますが、若干古い内容なため、現状の1.0系とはところどころ違っている部分もあるので、ひょっとするとdara-jが学んだようなことがだれかの役に立つかもしれない、と思いこの記事を書き始めました。

コードはなるべく検証してから掲載するように心がけますが、間違いやバグ、環境によって動作しないような部分があったらコメントやトラックバックでお知らせいただければ幸いです。

仕事などの関係もあるのでそうしょっちゅうは記事をかけないかも知れませんが、気長に読んでいただければ幸いです。

こっそり訂正 (07.08.28 11:48)

PHPのソース中の開始タグの「?」が抜けてました。間抜けすぎます。

コメント

_ メンズ ― 2008年01月26日 21時20分22秒

大変参考になりました。
ありがとうございました。

_ dara-j ― 2008年01月27日 02時39分43秒

メンズさん、コメントありがとうございます。
記事にご意見などありましたらまたお願いいたします。

_ sky ― 2008年08月27日 16時50分05秒

もっと細かいところで注意することありますか。
IIS + ISAPI RewriteでZFを使ってるんですがうまくいきません。

_ dara-j ― 2008年08月27日 18時47分34秒

skyさん、コメントありがとうございます。
長いこと放置状態になっている記事へのコメントで恐縮です(^^;

具体的にはどのようにうまくいかないのでしょうか?

記事中にあげているZend_Version::VERSIONの出力ができていないのであればインクルードパスの設定が反映されていないでしょうし、思ったアクションにうまくナビゲートされない(404エラーになる等)のであればリライトルールの問題だと思います。

PHP(またはIIS)でどのようなエラーがでているか教えていただければもう少しマシなコメントがつけられるかもしれないので、よろしければお願いします。

ただ、リライトルールについては、ディレクトリ構造によってはここに記載されているままではうまく動作しない場合もあるようですが、dara-j自身もZFのドキュメントなどに記述されているものをそのまま使っているだけなので、あまりお力になれないかも。。。

_ kei ― 2008年10月21日 11時37分17秒

test.htmlを作成してから画面を表示するとそのままtest.htmlを読みこんでしまいます。アパッチや.htaccessの設定もあっていると思うのですが、他に原因は考えられるでしょうか?

_ dara-j ― 2008年10月21日 14時21分16秒

keiさん

そのままtest.htmlが読み込まれるということはURLリライトが機能していないようですね。

以下の項目を見直してみてください。

・mod_rewriteが有効になっていない
 → httpd.confのLoadModuleでrewrite_moduleが有効になっているか確認(コメントアウトされていないか、パスは正しいか、等)
・httpd.confで.htaccessの使用が許可されていない
 → アプリケーションを設置したディレクトリのDirectoryディレクティブでAllowOverrideがNoneになっていないかを確認
・.htaccessでURLリライトが有効になっていない
 → RewriteEngine on が指定されているか確認
・.htaccessのリライトルールにtest.htmlがマッチしない
 → リライトルールを再確認

_ kei ― 2008年10月21日 16時57分07秒

無事に機能しました。原因はhttpd.confで.htaccessが許可されていませんでした。ありがとうございます。本当に役立っています。

_ kei ― 2008年10月24日 10時39分54秒

入門編、一度全部真似して入力してみました。大変参考になりました。
いま、練習で作っている質問を投稿したり、回答したりするようなものを実装しているのですが、xoops cube で使っていたDB(mysql)のテーブルをZend Frameworkでも使えるかなと使用してみたのですが、データは入るのですが、日本語が化けてしまいます。
本等を見てmy.cnfとphp.iniを文字コードをutf8に変更し再起動してみたのですが…。
やはりxoopsでは日本語OKだけど、zend frameworkだど化けてしまいます。
何か解決方法はないでしょうか?
ややこしい質問ですいません…。

_ dara-j ― 2008年10月24日 16時45分51秒

keiさん

んー、結構面倒な問題のようですね。

状況次第になってしまうのですが、my.cnfに
 skip-character-set-client-handshake
を追加する方法はどうでしょうか?

ただ、サーバ自体への設定になるので、他のアプリケーションに影響を及ぼす可能性もあるので難しいかもしれませんが。

skip-character-set-client-handshake については以下のURLが参考になると思います。

http://goungoun.dip.jp/app/fswiki/wiki.cgi/debianetch?page=2007%2F04%2F23-01%A1%A2skip-character-set-client-handshake+%A4%CB%A4%C4%A4%A4%A4%C6

_ kei ― 2008年10月27日 11時00分41秒

お返事遅れてすいません。
どうしようか迷った結果、ZendはZendで同じようなzendDBとテーブルを作成して日本語入れた結果、無事にデータが入ったのでそう対応する事にしました。
Zend Frameworkまったく知らなかったけど、お陰でだいぶ抵抗感もなくなりました。ありがとうございました。

_ kei ― 2008年11月25日 15時17分28秒

またまたハマってしまい、調べても答えが見つけられずdara-jさんに相談です。いつも頼ってすいません…。
1.ZendFrameworkのZend_DBコンポーネントを使ってDB接続をしたい。
2.DB環境がpostgreSQL7 → PDOドライバが8からしかない?(本当かどうかわかりません…いま調べているところではポスグレは8からしかPDOドライバがないようです。)

この場合、Zend_DBコンポーネントでの接続は諦めてpear等で接続するしかないのでしょうか?
もし分かればで良いので、よろしくお願いします。

_ dara-j ― 2008年11月26日 04時21分00秒

keiさん

コメント遅くなりましたが。

手元にPostgreSQLの7系の環境が残ってないので確証はないのですが、Zend_Dbで普通につなげられませんかね?

PDO周りではバージョンに関する具体的な記述が見つからないのですけど、PHPのPostgreSQL関数自体は6.5以降対応となっていますし、普通はクライアントライブラリのバージョンがサーバよりも新しくてもつながるのではないかと思います。機能に制限はあるかも知れませんが...

_ kei ― 2008年11月30日 02時03分22秒

そうですよね。実は仕事でそんな状況に陥ってしまい、結局クライアント側のPostgreSQLを8にして使うことになりました。いつも知識の薄い僕の質問にも丁寧に答えていただきありがとうございます。本当に助かりました。

コメントをどうぞ

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

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

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

トラックバック

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

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