やっぱ必要だろうということで

「今月はドキュメント強化月間だ!」といいつつActiveGatewayにかまけて何も手をつけれてなかったのですが、月の後半でドキュメント強化をやっていこうと思います。

で、ドキュメントですが今までいろいろな発表とかやってきましたが、いまいち理屈っぽい感じだったのでこれを打破するためにはやっぱファイル生成スクリプトが必要かなと思いはじめました。

んで、bobchinさんのcreateactionをベースにコマンドラインで動作するファイル生成スクリプトを準備しようかなと思っています。ファイル生成といってもあんまり複雑なものを出力するのではなくて、最低限のファイルを所定の場所につくってくれる程度でも制作のスピードアップになるかなと。

考えているのはこんな感じ。

  • 現状のmaple,webapp,htdocsと並列のディレクトリにbinディレクトリを新設
  • bin/generate とする(.phpをつけるかはまだきめてない)
  • ファイル生成スクリプトが生成するものは、「action」「template」「entry」「component」の4つとする。(もっといりますかね?)
  • actionファイルを生成するために以下のような指定をする。
    • bin/generate action sample_form sample_form index という形で実行する。
    • action後の1つ目の引数でaction名を指定し、actionの規約にのっとって、modulesディレクトリ以下にクラスファイルとmaple.iniを出力する。
    • クラスファイルは規約どおりのクラス名をつけ、'success'を返すだけのexecuteメソッドをいれておく。
    • maple.iniにはViewセクションのみ出力し、successの場合にaction名に合わせてテンプレート名を入れておく
    • 2つ目の引数はtemplateファイルの指定で、省略できることとする。
    • templateファイルに関しては指定された文字列を「_」で分けて、最後から1つ前までをディレクトリ名とし、最後のものに「.html」をつけたファイル名とする。
    • templateファイルには「Hello!, Maple」程度の記述をつけておく。(スケルトンファイルをそのまま出すという方式になるかな?)
    • 3つ目の引数を指定されている場合はその文字列で入り口phpを出力する(この引数はもちろん省略可)。デフォルトのaction名を指定されたaction名にしておく。
  • templateを生成するためには以下のような指定をする
    • bin/generate template sample_form という形で実行する。
    • 出力するものは上記actionのやり方に順ずる
  • 入り口PHPを生成するためには以下のような指定をする
    • bin/generate entry index という形で実行する。
    • 出力するものは上記actionのやり方に順ずる
  • componentクラスを生成するためには以下のような指定をする
    • bin/generate component sample.logic という形で実行する。
    • component 後の1つ目の引数でcomponent名を指定し、componentの規約にのっとって、componentsディレクトリ以下にクラスファイルを出力する。
    • クラスファイルは規約どおりにファイル名をつけておく。

「bin/gererate action sample_form sample_form index」とやれば、とりあえずコマンド一発で、「/index.php?action=sample_form」でページが出力されるというものができるので、そこから随時組み立てていけばいいのでそんな感じでいいかなと。

あとFilterとConverterとValidatorもこれで出力できた方がいいすかね?一応出力できるようにしてみるかな。あって邪魔にはならんだろうから。

後はこのコマンドに対する拡張性を持たせて自分の好きなパーツをこのコマンド経由で出力できるようにしておきたいなとは思います。

これができれば最初の方向けのドキュメントは書きやすくなると思うので、がんばって実装しちゃいたいと思います。

ご意見等ありましたら、いつもどおりコメントお願いします。

今後の課題

Wikiにも書きましたがActiveGatewayの今後のアップデートに関して残項目を挙げてみます。

  • メソッド名をcamelCaseにする。
  • 毎回テーブルのカラム名を取得するんではなくて、一度取得したものをconfigディレクトリ以下にキャッシュできるようにする。(設定ファイルで強制的に毎回カラム名取得するモードとか、取得済みならかならずキャッシュを使うモードといったものを制御できるようにしたい)
  • プライマリキーはかならずオートインクリメントだということでつくっちゃってるのでそのあたりはもっと柔軟性を持たせる。
  • レコード生成時刻、更新時刻を自動的にアップデートできる機能を追加する。
  • destroyやdeleteを実行したときに、関連テーブルに対する処理を行っていないので、必要に応じてできるようにする(ActiveRecordのdependentオプションへの対応)
  • PEAR::ErrorStackとPEAR::Logを使用してエラー処理・ロギングの仕様を固める。(これはMaple本体のCaseStudyになればいいなと思っています。)
  • find系メソッドの第一引数に指定している仮想テーブル名に対応するファイルがcomponents以下にあった場合にはそれを自動的に使うようにする。もし規約どおりの場所でないクラスファイルを使いたい場合には設定ファイルに「class_name = xxx」と指定するようにする(もちろん規約どおりの場所ってのを確定しないと・・・)
  • 更新系メソッドに関してActiveRecord同様before_create/before_saveといったようなある程度のフック処理を入れれるようにしておく。
  • eachメソッドで取得する際に全て取得するのではなくて、1件ごとに取得したり、10件先読みするというようなことができるようにする(そのための伏線は既にいれてある)。
  • DBアクセスをキャッシュできるようにする。
  • ADOdbやネイティブ関数版といったようなものを作りやすいような構造を検討する。
  • PostgreSQLでしかテストをしてないので他のDBでもテストする。
  • 引き続きActiveRecordを調べて便利な機能は取り込む。

こういうのがあったほうがいいんじゃない?というのがありましたらこちらもコメントお願いします。