ZendFramework 1.8が2009/4/30にリリースされました。この連載ではZend Framework 1.7を利用してきましたが、今後は1.8を利用します。Zend Framework 1.8は基本的に下位互換です。
それでは1.8の主な新機能を簡単に紹介します。
Zend Framework 1.8の新機能
Zend Framework 1.8の主な新機能は次の通りです。
- Zend_Tool
- プロジェクト、コントローラ、アクション等のスケルトンコードの自動生成
- Zend_Application
- アプリケーションのフレームワーク
- Zend_Navigator
- ナビゲーション
- Zend_CodeGenerator
- コード生成のフレームワーク
- Zend_Serivce_Amazon_Ec2
- Amazon EC2サービス用のインターフェース
- Zend_Service_Amazon_S3
- Amazon S3サービス用のインターフェース
このほかにも多数の機能が追加され、200以上のバグが修正されています。
この連載では1.7に付属していたZend_Toolプレビュー版のコマンドであるzfスクリプトを利用してきました。プレビュー版ということもあり、本来使えるはずのコード生成機能が使えませんでしたが、正式リリースとなりすべての機能が利用できるようになりました。
1.7と1.8のzfコマンドの違い
1.8のzfコマンドでプロジェクトを作成した場合、UNITテスト用のディレクトリが作成されたり、基本的なエラー処理を行うエラーコントローラやビューが用意されるようになりました。プロジェクトを生成して自動的に作成されるデフォルトページも、テキストだけだったものがグラフィックを含んだページに更新されています。
最も重要な違いは、プロジェクトを生成した時にコピーされていたZend Frameworkライブラリがコピーされなくなったことです。シンボリックリンク等を使って、Zend Frameworkのファイルを保存しているZendディレクトリにアクセスできるようにしなければなりません。
Zend Framework 1.8のインストール
ZendFrameworkのダウンロードページから1.8をダウンロードします。
執筆時点(2009/5/9)ではプレビューリリース版のダウンロードページと記載されていますが、ダウンロードできるファイルは正式版のZend Framework 1.8.0です。
今回から/wwwディレクトリにZendFrameworkを展開することにします。
新しいzfコマンドの使い方
新しいzfコマンドは従来通りシンボリックリンクでパスが通っている場所へリンクを作ってからも利用できますが、マニュアルとチュートリアルには直接スクリプトを実行するように記載されています。好みの方法で起動するとよいでしょう。
を実行するとヘルプが参照できます。
プロジェクトの作成
でプロジェクトが作成できます。プロジェクトを作成してみましょう。
プロジェクトファイルの中身は
となっており、testディレクトリにテスト用コードが配置され、Zend Frameworkライブラリファイルがコピーされていないことがわかります。Linuxなどのシステムではシンボリックリンクが便利なのでリンクを作ることにします。Windowsの場合はコピーしてしまうほうが簡単です。
Zend Frameworkのファイルへのアクセス
ライブラリファイルがコピーされていないので、プロジェクト削除直後はまだスケルトンを実行できません。
後はWebサーバがアクセスできるように/www/defaultのシンボリックリンクを更新します。
これで新しく作成したZend Frameworkアプリケーションのスケルトンにアクセスできるようになります。
エラーページの問題
エラー処理のページも用意されていますが、このページには問題があります。
のショートカットである
が利用されているため、php.ini設定によっては正しく表示できません。
アプリケーション起動時に必ず読み込まれるbootstrap.phpでストリームラッパーを使用し、読み込み時に“<?”、“<?=”を“<?php”、“<?php echo”に書き換える仕組みがZend Frameworkによって提供されていますが、この機能はかなりのオーバーヘッドが必要なためあまりお勧めできません。エディタの置換機能を使って書き換えてしまったほうがよいです。
新しいページ(コントローラ、アクション、ビュー)の作成
- Controller
- zf create controller name index-action-included[=1]
- View
- zf create view controller-name action-name-or-simple-name
- Action
- zf create action name controller-name[=index] view-included[=1]
zfコマンドは上記の書式でコントローラ、アクション、ビューの作成が可能です。
- http://localhost/foo/bar/
としてアクセスできる、barアクションを実行するfooコントローラのページを作成してみましょう。
indexコントローラも一緒に作成されたことが分かります。まずはindexコントローラにアクセスして動作を確かめてみましょう。
テキストだけのページですが、コントローラもビューも用意されているのでエラー無くページが表示されます。
今度はbarアクションを追加してみましょう。
必要なアクションがFooController.phpに追加され、ビューのbar.phtmlファイルが作成されたことが分かります。
FooController.phpとbar.phtmlの中身を見てみましょう。
この程度なら自分でコピーして作成してもよさそうですが、今後zfコマンドはさまざまな拡張が行われるようです。
zfコマンドで作成したプロジェクトの管理ファイル
コントローラとビューを作成する際に.zfproject.xmlファイルが更新されていることが分かります。これはプロジェクトの状態を保存するとともにプロジェクト内にどのようなコントローラ、アクション、ビューがあるか管理するファイルです。
このファイルを見ると、レイアウトやモジュールディレクトリなど多くの設定項目があることが分かります。今後、zfコマンドがどのように拡張されていくのか予想できます。
今のところzfコマンドは単純なスケルトン作成コマンドでしかありませんが、Zend Frameworkを利用するならzfコマンドでプロジェクト、コントローラ、アクション、ビューを作成するほうがよいでしょう。
guestbookアプリの動作
Zend Framework 1.8.0は上位互換ですが、ゲストブックのように簡単なアプリケーションでもアップグレードには注意が必要です。
index.php/bootstrap.phpの入れ替え
1.8のzfコマンドが生成するpublic/index.phpとapplication/bootstrap.phpのコードが変わり、クラス自動ロードの方法が変更されるのでエラーが発生しています。
1.8のコードでは初期化の多くがindex.phpに移動され、bootstrap.phpには空のクラスだけが定義されています。BoostrapクラスはZend Applicationから自動的に読み込まれるようになっています。また、アプリケーションの実行環境は環境変数から取得されるように変更されています。
Zend Framework 1.8でguestbook2アプリを動作させるためには、新しいzfコマンドで生成したpublic/index.php、application/bootstrap.phpをコピーし、library/Zendを削除し、新しいZend Frameworkのライブラリにアクセスできるようにするだけです。
動作環境の設定
1.7のzfコマンドで生成したプロジェクトでは、動作環境がbootstrap.phpにハードコードされていましたが、1.8のzfコマンドではAPPLICATION_ENV環境変数で動作環境を設定できるようになりました。デフォルトの動作環境はproductionに設定されているので、エラーページに詳細なエラー情報が表示されなくなります。
Apacheの場合、環境変数はmod_envモジュールのsetEnvディレクティブで設定できます。httpd.confの最後に[1]
を追加してWebサーバを再起動します[2]。
これでエラーページに詳細なエラー情報は表示されるべきなのですが、viewオブジェクトのenvに動作環境が設定されていません。APPLICATION_ENV定数はindex.phpで定義済みなのでviewオブジェクトの$this->envの代わりにAPPLICATION_ENV定数を利用すると詳細なエラーが表示できるようになります[3]。
まとめ
目立った機能追加などはありませんが、zfコマンドの仕様はプレビュー版と随分異なります。変更された部分はよい変更だと言えると思います。public/index.phpに基本設定を持たせ、Zend Applicationからアプリケーションがブートストラップコードを読み込む変更、APPLICATION_ENV環境変数から動作環境を設定できるように変更されたのでプロダクションサーバへのデプロイメントも容易になりました。
今後は新しいzfコマンドを使ってアプリケーションを構築していきます。