Simgは既定のフォルダーやファイルを多く作成する。
世に有名な「Hello,worldプロジェクト」でさえも以下のような構成が必要だ。
これは面倒である。
生産性向上が至上命令の我々に、たかが「Hello,world」一本で、この作り込みは厳しい。やはりSimgプロジェクトは再利用すべきだ。
というわけでSimgに再利用機能を追加した。
これを学術風に「オーバーロード機能」と呼ぶことにする。
サンプルプロジェクトのhellosimgをオーバーロード(再利用)するovl-hellosimgプロジェクトを作成してみよう。
プロジェクト構成は以下となる。
実にシンプルである。
久々に「Simple is great!」と言いたい。
さて、オーバーロードの仕組みとして以下の規約を設けた。
- 設定ファイルは上位プロジェクト優先で合成
- phpファイルは上位プロジェクト優先で上書き
- マジックメソッドによるSimg仕様オーバーロード
「マジックメソッドによるSimg仕様オーバーロード」は次回に譲るとして、残り2つを説明する。
まずプロジェクトの上位、下位だが、利用されるプロジェクトが下位で、利用する方が上位と考える。例では「ovl-hellosimgプロジェクト」が上位、「hellosimgプロジェクト」が下位だ。
設定ファイルはconfigやview/rsourceで作成するエントリー・キー・値から構成されるお馴染みのファイルだ。上位プロジェクトで下位プロジェクトの値を変更したい場合は、同一構成のフォルダーに同名のファイルを作成し、キー値を変更すれば良い。phpファイルもロジックを変更したいファイルと同一構成のフォルダーに同名のファイルを作れば、下位のphpと置き換えることができる。Action、Pager、Porter及びRenderは上位プロジェクトでも追加でき、動作変更も可能だ。
さて、「Hello,worldプロジェクト」を思い出してほしい。
localhostで「なせば成る」、localhost?_lang=enで「Yes we can」を表示する。
これを、localhostで「諸行無常」、localhost?_lang=enで「Impermanence of worldly things」と表示してみよう。
hellosimgプロジェクトでは日本語リソースのview/resource/resource.iniで、
TITLE=初めてのSIMG MESSAGE=なせば成る
英語リソースのview/resource/resource.enで、
TITLE=Hello, SIMG MESSAGE=Yes we can.
と定義されている。
どうやらこの2ファイルのMESSAGEをオーバーロードすれば良さそうである。
ovl-hellosimgプロジェクトで以下のように再定義しよう。
日本語リソースのview/resource/resource.iniは、
MESSAGE=諸行無常
英語リソースのview/resource/resource.enは、
MESSAGE=Impermanence of worldly things
となる。
これで、localhostは「諸行無常」、localhost?_lang=enは「Impermanence of worldly things」と表示されるはずだ。
尚、プロジェクトの上下関係はindex.phpで指定する。
因みに下記がovl-hellosimgプロジェクトのindex.phpだ。
<?php $app_root_path = 'C:/.../ovl-hellosimg'; $base_root_path = 'C:/.../hellosimg'; $simg_root_path = 'C:/.../simg'; set_include_path( get_include_path() . PATH_SEPARATOR . $simg_root_path); ob_start(); require_once('SimgLog.php'); require_once('SimgEntry.php'); SimgLog::getInstance()->initialize( $app_root_path . "/logs" . "/trace_" . date('Y-m-d') . ".log", "test"); $entry = new SimgEntry( array($app_root_path, $base_root_path), $simg_root_path); $entry->dispatch(); ?>
$app_root_pathはプロジェクトのパス、$base_root_pathは再利用されるプロジェクトのパス、$simg_root_pathはSimgのパスだ。
SimgEntryのコンストラクタにプロジェクトの構造(上下関係)を送っている。
arrayの先頭要素が上位プロジェクト、第2要素が下位プロジェクトだ。
配列であるからプロジェクト構造は3個以上も可能である。
複数のプロジェクト間で利用関係を構築できるわけだ。