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の魅力たっぷりにお送りしたいと思います!(多分…。)

*1:自動的に作成される.htaccessの中でアプリケーションのディレクトリをinclude_pathに設定しているようで、init-appの引数をフルパスにしておかないとindex.phpからApp.phpが見つけられなくなるので注意。

*2: (2010/01/27)ルールの書き方がおかしかったので修正