ということで前回に引き続き、WebORB for PHP + S2Dao.PHP5でRemote Objectです。
今回は、S2Base.PHP5プロジェクトの作成です。
前回は、Eclipse上にサーバサイドのプロジェクトのスケルトンを作成しました。
今回はS2Base.PHP5上に、サーバサイドで使用するコンポーネントを作成いたします。
S2Base.PHP5には、DTOやDAOの自動生成機能がありますから、この機能を利用して手抜き楽をしようという、そんなへっぽこ計画でございます。
準備(というか前提条件)
以下を完了しておいてください。
S2Base.PHP5でEoDも参考になるかと思います。
- S2Base.PHP5をセットアップ
- EclilpseにWicked Shellをインストール
- EclipseにS2Base.PHP5のインストールディレクトリ以下のprojectディレクトリをプロジェクトルートとするPHPプロジェクトを作成(以下、S2Base.PHP5プロジェクトと呼びます。)
- 使用するRDBMSをインストールして、処理対象となるテーブルとテストデータを作成
モジュール作成
EclipseのWicked ShellビューからS2Base.PHP5のインストールディレクトリにあるprojectディレクトリに移動して、phingコマンドを実行します。
<S2Base.PHP5のインストールディレクトリ>\project>phing
すると対話型コンソールが起動しますから、7 : moduleを選択します。
モジュール名を聞かれますから、適宜作成するモジュール名を入力します。
で後はconfirm ? (y/n)と聞かれますから、yを入力。
あっという間にモジュールディレクトリが構成されます。
EclipseのS2Base.PHP5プロジェクト上のapp/modulesディレクトリを選択してF5キーを押して内容を更新してください。
作成したモジュール名がついたディレクトリが現れます。
続いてクラス群を生成していくわけなんですが、S2Base.PHP5プロジェクトのapps/commons/dicon/pdo.diconがDBアクセスの設定ファイルなので適宜修正しておいてください。
そしてdaoコマンドで一気にクラス群を生成します。
WebORBの仕様とS2Base.PHP5が自動生成するクラス群は若干違うので、多少手戻りがでますが、ひとまず気にしない。
S2Base.PHP5の対話コンソールで、2 : daoを選択してください。
[ Module list ]で、今回作成したモジュールの番号を入力します。
続いてuse database ? と聞かれますから、yでDBを使うことにします。
するとDBからテーブルを持ってきて、一覧を表示してくれますから、作成するテーブルを選択します。
で、次にDAO名を入力します。(userテーブルのDAOを作るのであれば、UserDaoとか。)
さらにEntityのクラス名。(userテーブルのDTOを作るのであれば、Userとか。)
後はconfirm?と聞かれて情報が一覧されますから、OKであればyと入力すると、一気にDTO、DAO、さらにはDAOのテストクラスやインクルードファイルまで作成されます。
EclipseのS2Base.PHP5プロジェクト上のapp/modules/<作成したモジュール>ディレクトリを選択してF5キーを押して内容を更新してください。
さて、ここからがちょっと重要です。
先程も説明したとおり、
>WebORBの仕様とS2Base.PHP5が自動生成するクラス群は若干違うので、多少手戻りがでますが、ひとまず気にしない。
の手戻り部分+前回作成したサーバサイドプロジェクトでこのクラス群を便利に使いまわすための準備です。
Entity(DTO)定義ファイル名修正
WebORBでは、DTOを定義するファイル名は、DTO名.phpとなっていなければならないので、S2Base.PHP5が作成してくれた<DTO名>.class.phpでは使えません。
app/modules/<作成したモジュール>/entity/<DTO名>.class.phpのファイル名を<DTO名>.phpに変更してください。
diconファイル格納ディレクトリ定数宣言
作成した定義ファイルをサーバサイドプロジェクトのディレクトリ構成でも使えるようにする為、app/modules/<作成したモジュール>/<モジュール名>.inc.phpにdiconファイル格納ディレクトリを定数として宣言します。
app/modules/<作成したモジュール>/<モジュール名>.inc.phpを開いて先頭に以下を記述してください。
あ、先頭って言っても当然<?phpタグの中ですよ?
define("<モジュール名>_DICON_DIR", "<S2.Baseプロジェクト内のapp/modules/<作成したモジュール>/diconディレクトリへの絶対パス>");
dao.diconとpdo.diconをコピー
さらに作成したモジュールからS2Base.PHP5への依存性をなくす為にapp/modules/<作成したモジュール>/diconディレクトリにDB接続情報とDAOの設定ファイルをコピーします。
app/commons/dicon/ディレクトリからdao.diconとpdo.diconをコピーして、app/modules/<作成したモジュール>/diconディレクトリにコピーしてください。
diconファイルの修正
S2Base.php5が作成したDAOの設定ファイルと先程コピーしたファイルを修正します。
まずは、S2Base.php5が作成したDAOの設定ファイルです。
インクルード先として、S2Base.PHP5標準のdao.diconが指定されていますから、ここを先程コピーしたdao.diconをさすように修正します。
具体的には、
<components>
<include path="%S2BASE_PHP5_ROOT%/app/commons/dicon/dao.dicon"/>
<component class="<作成したDAO名>">
<aspect>dao.interceptor</aspect>
</component>
</components>
から
<components>
<include path="%<diconファイル格納ディレクトリ定数名>%/dao.dicon"/>
<component class="<作成したDAO名>">
<aspect>dao.interceptor</aspect>
</component>
</components>
ですね。
diconファイル格納ディレクトリ定数の最後に/をつけたかどうか注意です。
続いてdao.diconです。S2Base.PHP5標準のpdo.diconをインクルードしてますから、同様に修正です。
<components namespace="dao">
<include path="%PDO_DICON%" />
<component class="S2Dao_BasicStatementFactory" />
<component class="S2Dao_BasicResultSetFactory" />
<component class="S2Dao_FieldAnnotationReaderFactory" />
<component class="S2Dao_DaoMetaDataFactoryImpl" />
<component name="interceptor" class="S2DaoInterceptor" />
</components>
から
<components namespace="dao">
<include path="%<diconファイル格納ディレクトリ定数名>%/pdo.dicon" />
<component class="S2Dao_BasicStatementFactory" />
<component class="S2Dao_BasicResultSetFactory" />
<component class="S2Dao_FieldAnnotationReaderFactory" />
<component class="S2Dao_DaoMetaDataFactoryImpl" />
<component name="interceptor" class="S2DaoInterceptor" />
</components>
です。
これで、サーバサイドプロジェクトに安易にコピーできるDAOとDTOの作成が完了しました。
ひとまずWichek ShellからS2Base.PHP5のユニットテストコマンドを実行して、これまでの作業に誤りがないことを確認してみましょう。
<S2Base.PHP5のインストールディレクトリ>\project>phing test -Dtd=/modules/<作成したモジュール>
テストはデフォルトの試験が実行されますから、
project > test: [echo] test directory : test/modules/<作成したモジュール> [echo] test target : **/*Test*.php <作成したDAO>Test::testA [phpunit2] Testsuite: <作成したDAO>Test [phpunit2] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.04048 sec BUILD FINISHED Total time: 0.8869 seconds
こんな感じの結果になると思います。
デフォルトのtestAが実行されてその結果が表示されます。
はい、今日はとりあえずここまでです。
今日は、サーバサイドプロジェクトから楽に使い回す為のS2Base.PHP5モジュールのスケルトンを作成いたしました。
明日以降は、S2Base.PHP5モジュールの実装と、クライアントサイドプロジェクトの作成なんかを書いていきます。