いまさらだけどrhaco2の紹介と、自分用のセットアップのメモ

rhaco2は内容が変わりやすいフレームワークです。
この記事の公開日が過去な程、参考にはなるかもしれませんが、正確じゃなくなっている可能性が高くなります。
また、手探りで調べているところも多いので、元々正確じゃないかもしれません。

rhaco2の特徴

rhaco2本体*1はたったの30ファイル程度と、とてもコンパクトなフレームワークです。
マジックメソッドをふんだんに使ったObjectというクラスがあり、これを基底クラスとしておよそphpとは思えない独特な機能を提供します。
コンパクトなcoreをベースに、vendorsと呼ばれるライブラリを使って拡張していくスタイルのようで、データベースと接続する機能も、ライブラリとして提供されます。
rhaco2ライブラリ用のリポジトリサーバーを作る機能が、coreに組み込まれている程です。


基本的に分かりやすいドキュメントというのは整備されにくく、ソースコードそのものか、rhaco2が独自に備えるDocBlockからのAPIリファレンス生成機能が頼りです。
バージョンという概念がほぼ無く、基本的に最新のものを使うしかありません。*2
rhaco1の頃の「No trunk. No rhaco」というフレーズが、rhacoを良く表してます。
そのtrunkも、ほぼ毎日コミットされていて、1日に数リビジョンは上がっていくので、色々と大変な気はします。
ただ、根幹の部分はほぼ完成されているので、そんなすごい変更はそうそう無いらしいです。

システム要件

PHP
  1. バージョン
    1. PHP 5 >= 5.2.11
  2. 拡張モジュール
    1. mbstring
    2. zlib
apache
  1. モジュール
    1. mod_rewite*3

rhaco2のセットアップ

> mkdir hoge
> cd hoge
> curl -LO http://rhaco.googlecode.com/files/setup.php

# インストール
> php setup.php
set or install[/hoge/core/]: ../core[ENTER]
install application: org.rhaco.sample.hello_xml[ENTER]
application url: http://localhost/hoge[ENTER]
working directory [/hoge/work/]: [ENTER]
application mode: dev[ENTER]

# .htaccessの作成
> php setup.php -htaccess

# http://localhost/hoge/hello にアクセスして確認

http://rhaco.org/rhaco2

公式サイトにこれだけしか書かれてないのもすごいですが、大体これでセットアップできます。
rhaco2はコマンドラインでsetup.phpを実行すると、対話型でセットアップが出来ます。
core自体は、セットアップの最中にsetup.phpが最新をダウンロードしてくるので、最初に必要なのはsetup.phpだけです。

setup.phpの機能
$ php setup.php 
application name, summary.

==================================================
description
==================================================

try 'php setup.php -h *****' for more information
  app                : アプリケーションXMLのひな形の作成
  app_config         : アプリケーションの設定を変更する
  def                : 定義名のリスト
  display_errors     : phpのエラー出力を制御する
  eclipse            : eclipse用のツール
  export_core        : coreをエクスポートする
  export_libs        : repositoryのtgzをexportする
  gettext            : po,moファイルを生成する
  htaccess           : .htaccess (RewriteBase)を生成する
  import             : Repositoryからライブラリパッケージをimportする
  import_repositorys : 定義されたrepositoryからxmlを取得し、全てのパッケージを取得する
  install            : Repositoryからアプリケーションをインストールする
  log                : デバッグアウトを制御する
  man                : ソースドキュメントを表示する
  repository         : Repositoryが提供するアプリケーションとライブラリの一覧を表示する
  repository_server  : Repository serverになる
  test               : testを実行する
  up                 : vendorsをすべて更新する

最初のセットアップが完了すると、coreがダウンロードされて、setup.phpと同じ場所に__settings__.phpが生成されます。
2回目以降setup.phpを実行すると、こんな機能が使えるコマンドとして使えます。

自分用のセットアップのメモ

php setup.php
$ pwd
/Users/myuser/Dev/pdt2.1/tryrhaco2/
$ mkdir temp
$ cd temp
$ curl -LO http://rhaco.googlecode.com/files/setup.php
$ php setup.php
core path[/Users/myuser/Dev/pdt2.1/tryrhaco2/temp/core/]: ../../core.latest         
install application: 
application url [http://localhost/temp]: http://pdt21.localhost/tryrhacco2/temp
working directory [/Users/myuser/Dev/pdt2.1/tryrhaco2/temp/work/]: 
application mode: dev
apacheのhtdocs
/Users/myuser/Dev/pdt2.1/
上記に対応するURL
http://pdt21.localhost/
rhaco2をセットアップしたい場所
http://pdt21.localhost/tryrhacco2/temp
coreの置き場所
/Users/myuser/Dev/pdt2.1/core.latest

いちいちVirtualhostの設定をしたり、Virtualhostがネームベースだからhostsに追記したりするのが面倒なので、1個だけVirtualhostを設定してます。
なので通常だと殆どデフォルト値でいけるセットアップが、ちょっと入力が必要になってます。

  1. core path
    1. カレントディレクトリからの相対で入力できます。
    2. 既にcoreがあるパスを入力すれば、それを使いますし、無ければリポジトリから最新のcoreをダウンロードして設置します。
  2. install application
    1. rhaco2を使って作られたアプリケーションのインストール。開発のためにセットアップするなら、基本的に入力しない。
  3. application url
    1. 前述のとおりドメインルートの下にディレクトリを置いてるので、正しいURLを入力します。
  4. working directory
    1. アプリケーションが生成するキャッシュファイルなどの置き場所。特に理由が無ければデフォルト値でOK。
  5. application mode
    1. モードを切り替える機能があるみたいですが詳細は不明。
    2. とりあえず入力しなくても良いし、好きに入力しても動きます。
    3. release と stage は、rhaco2側で意味がある値のようです。
アプリケーションXML.htaccessの生成
$ php setup.php -h app
Usage:
  string value アプリケーションxmlの名前
  
  Option:
    htaccess : (mixed) 
  
  
  アプリケーションXMLのひな形の作成
$ php setup.php -app -htaccess /tryrhaco2/temp
write /Users/myuser/Dev/pdt2.1/tryrhaco2/temp/index.php
write .htaccess

アプリケーションXMLの雛形と、ついでに.htaccessを生成。

$ cat index.php 
<?php require dirname(__FILE__)."/__settings__.php"; app(); ?>
<app>
	<handler>
		<map url="" template="index.html" />
	</handler>
</app>

フレームワークによってdispatchとかroutingとか言うURLマッピングを、rhaco2ではこんなアプリケーションXMLで書きます。
アプリケーションXMLの書き方は、色々あるみたいですが、とりあえず雛形としてはこれが生成されます。
あと、アプリケーションXMLを使わなくてもURLマッピングは出来るはずですが、まぁこれが定石です。

$ cat .htaccess 
RewriteEngine On
RewriteBase /tryrhaco2/temp

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/$1?%{QUERY_STRING} [L]

mod_rewriteが使える場合に限るけど、mod_rewite用の.htaccessを生成されます。
前述の通りドメインルートにディレクトリを作ってるので、RewriteBaseを引数として書いてあげないと動きません。

$ php setup.php -htaccess /tryrhaco2/temp

アプリケーションXMLと一緒に生成したけど、htaccessオプションを使えば.htaccessだけ生成できます。

__settings__.phpにエラー出力とデバッグ出力について定義する。
$ cat __settings__.php
<?php
require_once("/Users/myuser/Dev/pdt2.1/core.latest/jump.php");
App::config_path(__FILE__,"http://pdt21.localhost/tryrhacco2/temp/","/Users/myuser/Dev/pdt2.1/tryrhaco2/temp/work/","dev");

__settings__.php は環境に依存する定義を書く所です。
最初のインストール直後は、こんな内容になってます。
基本的に環境に依存する事は __settings__.php 以外には書いちゃだめです。

$ vi __settings__.php
<?php
require_once("/Users/myuser/Dev/pdt2.1/core.latest/jump.php");
App::config_path(__FILE__,"http://pdt21.localhost/tryrhacco2/temp/","/Users/myuser/Dev/pdt2.1/tryrhaco2/temp/work/","dev");
display_errors(false,true);
Log::config_level("info",false);
C(Log)->add_module(R("org.rhaco.io.log.LogFile"));
C(Log)->add_module(R("org.rhaco.io.log.LogFirebug"));
C(Log)->add_module(R("com.tokushimakazutaka.io.log.LogGrowl"));
$ php setup.php -display_errors on
update __settings__.php

display_errors(false,true) はエラー出力についての設定で、エラーが発生したらブラウザにエラーメッセージが出る定義です。
このコマンドで display_errors(false,true) が追記されるけど、自分で書いてもいい。

$ php setup.php -display_errors off
update __settings__.php

ちなみに、こうすると __settings__.php から display_errors(false,true) が消えてしまい、php.iniの設定に依存する状態になりました。
php.ini がエラーを出力する設定になってると、どっちにしてもエラーは出ちゃいます。
リリース時はエラーを出さない方が良いので、直接 display_errors(false,false) と書くと出なくなります。


Log::config_level("info",false); は、デバッグレベルをinfoに設定した上で、第2引数がfalseなのでデバッグ出力をブラウザでは表示しない設定です。
その代わり、Logクラスにモジュールを追加し、デバッグ出力をファイルに保存*4したり、Firebugのコンソールに表示*5したりしてます。
C(Log)->add_module(R("com.tokushimakazutaka.io.log.LogGrowl")); は、読んだとおりMacでよく使われるGrowlに表示するモジュールだけど、自分の環境では動きません。*6


ちなみにR()はオブジェクトのリファレンスを返す関数ですが、引数にライブラリを指定すると、まだ導入してなければリポジトリからダウンロードしてくれます。
rhaco2のvendorsは、使いたくなったらそのまま書いて、実行すれば良いんです。
他にもちゃんとimport()関数があったり、php setup.php -importてのもあります。


長くなりすぎたので、この辺にしときます。

*1:coreと呼ばれる

*2:コミットコメントに「release point」というのがあるけど、どうなんだろう?

*3:無くても良いけどあったほうが良い

*4:C(Log)->add_module(R("org.rhaco.io.log.LogFile") );

*5:C(Log)->add_module(R("org.rhaco.io.log.LogFirebug") );

*6:1回動いたけどcoreを更新したら動かなくなっちゃった。