BEARで始めるWebアプリケーション開発 その1「インストール〜HelloWorld」
今回から、ちょっとずつBEARを触っていってみようと思います。今回は、とりあえず基本に従って、インストールからHelloWorldまで。
早速インストール
インストールの手順は本家Wikiのインストールのページを参照しました。
→Google Code Archive - Long-term storage for Google Code Project Hosting.
PEARパッケージなので、"pear install"で一発インストールできて楽ちんですね。
$ sudo pear channel-discover pear.bear-project.net $ sudo pear install -a bear/BEAR-beta
結構依存パッケージが多いみたいで、色々と追加でインストールされました。
ちゃんとインストールできたかどうか確認する為、バージョンを表示させてみます。
$ bear --version bear version 0.8.11.
オッケーですね。
こんにちは、Worldさん
さくっとインストールできたので、早速最初の一歩、HelloWorldしてみます。
お試し環境は以下の通りとします。
- ドキュメントルート
- /home/www/
- アプリ配置ディレクトリ
- /home/bear/
Saffold的なものがあるので、さくっとコマンドを叩いてみます。
$ bear init-app /home/bear/helloworld BEAR App files are successfully made at '/home/bear/helloworld'. Thank you for using BEAR.Ok.
簡単ですね!*1
ドキュメントルートから辿れるように、シンボリックリンクを張ります。
$ cd /home/www $ ln -s /home/bear/helloworld/htdocs helloworld
これで準備オッケー。で、HelloWorldを作るんですが、何もしなくてもサンプルとしてindex.phpに、ExciteニュースのRSSを取得するページが設定されるようなので、早速アクセスしてみます。
が…何か、エラーが…。
Fatal error: Class 'BEAR_Util' not found in /home/bear/helloworld/App.php on line 65
App.phpの該当の部分近辺を見ると、
<?php // 開発モード(キャッシュクリア) if ($mode == 1) { BEAR_Util::clearAllCache(false); } BEAR::init($app); ?>
こうなっています。ソースを辿って調べてみると、BEAR_Utilクラスは、BEAR::initした後じゃないと呼び出せないような気がします…。
仕方が無いので、先にBEAR::initが来るように、以下のようにしてみました。
<?php BEAR::init($app); // 開発モード(キャッシュクリア) if ($mode == 1) { BEAR_Util::clearAllCache(false); } ?>
これでとりあえずは、サンプルページの表示まではできました。
でも、CSSが読み込まれてないっぽい…。
生成されたHTMLを見てみると、CSSやJSはドキュメントルート直下に読みに行くようになっているようです。ただ、今回作った環境は、ドキュメントルートから一つディレクトリを掘ったところにCSSが置かれているので、このままではCSSを読み込む事ができません。
どうしようか悩んだんですが、結局、ドキュメントルートに.htaccessを置いて、mod_rewriteのルールを設定する事で対応する事にしました。*2
RewriteCond %{HTTP_REFERER} helloworld/ RewriteRule ^css/(.*) /helloworld/css/$1 [P,L] RewriteCond %{HTTP_REFERER} helloworld/ RewriteRule ^js/(.*) /helloworld/js/$1 [P,L] RewriteCond %{HTTP_REFERER} helloworld/ RewriteRule ^__bear/(.*) /helloworld/__bear/$1 [R,L] RewriteCond %{HTTP_REFERER} helloworld/ RewriteRule ^__panda/(.*) /helloworld/__panda/$1 [R,L]
また別途記事で触れようと思いますが、BEARにはかなり強力なデバッグツールが用意されていて、htdocsにデバッグツール用のシンボリックリンクがあったので、そちらも使えるようにルールを定義しておきました。
ちょっとイレギュラーな方法ではありますが、元々、init-appで作成されたhtdocsディレクトリをドキュメントルートに設定する事が想定されていると思うので、まぁこのくらい設定が必要なのは仕方ないところですかね。
今度こそ、こんにちはWorldさん!
前置きが長くなりましたが、やっとHelloWorldです。手順は、本家Wikiのチュートリアルページを参照しました。
→Google Code Archive - Long-term storage for Google Code Project Hosting.
まず、htdocs配下に、helloworld.phpというページファイルを作成します。
<?php require_once('App.php'); /** * HelloWorldページ * */ class Helloworld extends App_Page { function onInit() { $this->set('message', 'Hello World'); } function onOutput() { $this->display(); } } BEAR_Main::run('Helloworld'); ?>
チュートリアルでは、クラス名が"Page_Hello_World"になっていましたが、"Page_"の接頭語はなくても大丈夫なようです。
あと、テンプレートのパスが"templates/hello/world.tpl"になっていましたが、"App/views/pages/hello/world.tpl"の間違いと思われます。
上記で作ったサンプルでは、アンダースコアを無しにしたので、テンプレートのファイルは、"App/views/pages/helloworld.tpl"に作成しました。
<html> <head> <title>{$message}</title> </head> <body> {$message} </body> </html>
これで、無事に画面に"Hello World"と表示されました。めでたし、めでたし…。
余談
BEARでは、bearmodeというサーバ環境変数を変更する事で、簡単に動作モードを切り替える事ができます。デフォルトでは、.htaccessに以下のような記載があり、デバッグモードで動作するようになっています。
SetEnv bearmode 1
本番環境にあたるライブモードだとどうなるのか見てみようと、bearmodeを0に設定してみたところ、なぜだかレスポンスコード503が返るようになってしまいました。
エラーを見てみたところ、どうやらerror_reportingの設定のところで問題があったようでした。(PEARディレクトリ配下のPanda.phpの338行目)
<?php ini_set('display_errors', 0); error_reporting(self::$_config[self::CONFIG_ERROR_LEVEL_LIVE]); assert_options(ASSERT_ACTIVE, 0); ?>
$_configの内容を読むようになっていますが、CONFIG_ERROR_LEVEL_LIVEに既にエラーレベルが定義されているので、そのままerror_reportingに渡すようにすればよいようです。
<?php ini_set('display_errors', 0); error_reporting(self::CONFIG_ERROR_LEVEL_LIVE); assert_options(ASSERT_ACTIVE, 0); ?>
HelloWorldでこの調子だと、まだ結構バグがあったりするのかなぁ…。まぁ、また記事を書きながら気付いたら、随時記事に追記していくようにしようかなと思います。
次回は?
これでやっとスタート地点に立てたところな訳ですが、次回は実際にWebアプリケーションを作っていく過程に入っていく予定です。
という訳で、次回からはBEARの魅力たっぷりにお送りしたいと思います!(多分…。)