わざわざ残す必要もないことを整理とか気にせずに吐き出していく。そんな空間。

fuelphpでCMM(Contents Management Module)を作ってる話

 fuelphpでCMM(Contents Management Module)を作っている。

 長らくWordpressを使っていて使いにくいなぁと思うところをざっくりと解決するようなものになればということでずっと構想を練ってきたんだけど、やっとこさ動くっぽい感じのモノが出来たところ。

CMSとCMM

 CMSというのはソレひとつで一つのシステム。いわゆるカプセル化?なので細かい部分のカスタマイズが非常に面倒になってくる。Wordpressを使ってて不満に思うのはDBスキーマがややこしい(自分で定義出来ない)とか、コードの中身が読みにくい、APIが使いにくい、などなど。もともと裏で何をやっているか気にしなくてもいい、というのが利点だから仕方ないことでは有るんだけど、気になる人間からしたら気になって仕方がない。

 コンテンツ、なんてのはスタイルとかを除けばあくまで「モデル」の話。ならモジュール化してどんなシステムからでも利用可能な形を提供してやるのがいいんじゃないかと。テーブル定義をささっと書いて、データを用意したら後は勝手にコンテンツ管理してくれる、そういうものがアレばいいなぁと長年(という程でもないけど)思っていた。

fuelphpのモジュール機能

 オートローダ付きのfuelphpはクラスのモジュール化も非常に楽ちん。もちろんコンパイル形式の言語じゃないから細かいエンティティとかまでクラス化するのは流石に気が引けるけど、そこそこ機能ごとのコード分けならそこまでパフォーマンス的にも悪くはならない。

 fuelphpのコード分離にはモジュールとパッケージがあるけど,小さな部品程度ならモジュールの方が良さそう。逆にパッケージはもうちょっと大きめのコード群。ロード時にbootstrapがつくのもパッケージのいいところ。

 分離したコードはマナーさえ覚えてしまえばFW内の通常のコードと区別無く利用する事が可能になるので開発の手間も非常にシンプル。この辺の利点は本当にありがたい。

fuelphpのModel_Crud

 これがめちゃくちゃ便利でやっぱり驚いた。今回やったのはデータ定義配列を元にテーブル作成からデータ挿入までを自動化する感じのプログラムなんだけど,Model_Crudならクラス設定をさっと済ませるだけで,あとのCRUD処理は全部お任せでOK。しかもバリデーションまでやってくれる。

 中覗いてみるとpre_postとか暗号化関連で面倒な部分とかもバッチリお任せ出来るような仕組みも備わっていて、非常に魅力的。バリデーションとDAOの連携も嬉しい。不可分に一体化して提供されているわけではなく、個々に分離した独自のオブジェクトとして存在しつつも一回のforgeでその両方が自動的に用意される。ステキすぎる。

 バリデーションの仕組みもCIに比べてめちゃクチャ向上してるしねぇ…コード組んでて単純に楽しい。

あとがき

 めんどかったところ

  • create_tableのテーブル定義配列からCrudオブジェクトのバリデーションルールに変換するとき  (でもconstraintはテーブル定義時には面倒だったけど、ここでは非常に助かった。)
  • File::read_dirの戻り値がコレクションとリストの混在形式で扱いが面倒
  • Taskはもうちょっと洗練されていい。あとモジュールのTaskの名前空間はいつも最初に迷う。
  • Task系の開発でも部品レベルではWeb画面使って、の方が効率的だということに、大分後になって気付いた。プロファイラの有無はやっぱり大きい
  • ValidationもModel_Crudもドキュメントが乏しすぎ。まぁコードが見やすい分Core覗けば大抵のことはわかるんだけれども…
  • Model_Crudで定義した$_connectionが単純にDBクラスのexecuteの引数として使われてるのが残念。これだとModel_Crud以外の通常DBアクセスで$_connectionが自動適用されない。$_connection 適用済みのDBクラスインスタンスをModel_Crudの中にプロパティとして持っておいてソレをみんなで使いますとかのほうが幸せになれそう。
  • いつの間にか\Console::log()が使えなくなっていて、そしていつの間にか\Profiler::console()が使えるようになっていた。
  • 継承関係の実行前エラー出た時の検出がなんかおかしい。Profiling有効モードではなぜかPQPのエラーになる。
  • PHPのメソドオーバライド、引数の数揃えないかんのは知ってたけど、タイプセーフまで揃えなアカンとは…不便。

 反省点

  • コーディングの手順とか設計とかホントに効率悪すぎ。全体的に機能の見通しがたってないし,考慮が乏しすぎる。後から拡張の必要に気付いて書き直し…とか多すぎで目も当てられない。
  • 決め打っちゃうべきところと,幅もたせるところ、引数でどの程度まで自由度与えるか、データをどのクラスに帰属/管理させるか、そのへんの決定判断が弱い。
  • やっぱりコードコメント日本語でしか書けない。毛唐のためになれない自然言語使いたくない。でも英語で書かないとgithubに上げれない…つらたん。