読者です 読者をやめる 読者になる 読者になる

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

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

 最近は組んでばっかりなのでこんな話しか出来ない…

 内容的には、前回の続きです。

MVC再考

 いろいろ組んでてMVCを再考する機会が出来た。今まではスキニーコントローラ教信者とも言えるくらい、コントローラの既述は排除してきてたけど、あ、なんか違うなぁと。

 やっぱりコントローラに処理を書きたくないというのは変わらない。基本はスッキリサせたい。でもViewとModelの呼び出しだけってのはちょっと…そう思っていた中でControllerの重要な役割を一つ思い出した。「異常系の制御」

 やっぱり異常系の制御はControllerでやるべき。例外が発生した時に404するか503するかは制御系の問題。処理はモデルやViewModelに一任するのは間違いないけど,こいつらがHttpNotFoundExceptionとかをthrowするのはなんかおかしい。だからControllerはtry,catchしなきゃならない。モデル,Viewの呼び出しに加えて、try.catchによる例外分岐がシンプルでスッキリした理想のコントローラ体系何じゃなかろうかと思い直した。

CliアプリケーションとWebアプリケーション

 この辺の違いをめちゃクチャ痛感する。要は動的な画面。

 例えばDBに10件のデータを格納するCLIアプリを作成する時。普通のWEBなら10件全部を1メソドで格納してメッセージとかは内部で蓄積してやればいい。でもCLIだとやっぱりリアルタイムに見せたいよねってなるし、そうなってくると1件ずつforeachで回しながら出ないと状態が把握出来ない。モデル側からechoするのはヤッパリ気持ち悪いし。

 Modelが逐次状態をViewに通知する構造なんてのはWebでは考えられなかったから,こういう経験は結構新鮮だった。本来ならViewからオブザーバー張ってみたいな感じになるんだろうけどCLIでそんなの面倒臭いし,コントローラ監視の方が楽。となるとやっぱりコントローラの既述も増えてくるし…めんどくせぇ。

CLIのグローバル対応について

 これ、一回やろうと想ってメッセージファイルとか作ってみたけどめちゃくちゃめんどくさいねぇ…こういうのはGUIアプリケーションだからこそ出来る事か。多言語対応する部分としない部分との境界もよく見えないし。結局開発を大幅に止めそうだからこの辺りは断念。とりあえず英語で書いてみたけど英語力には自信ないのよねぇ…。

 メッセージファイルとか設定ファイルとかはいつもそうなんだけど,項目値とコードの依存関係、どうやって管理するのが適切なんだろうか。上手いこと運用できる方法あったら教えて欲しいもんだわ。

CMSはフロントの実装も面倒臭い

 CMSはフロントの実装も面倒臭い。まぁ単一取得系は楽ですよ。問題は複数行取得系。内部的にはlimitとかoffsetとか。こういうのってどういう形でするのがベスト・プラクティスなんだろうか。

 基本的にはデータの取得と同時に、ページ番号、ページサイズ、トータル件数(に加えて取得件数)が必要になってくる。このデータはデータの取得と同時に返ってくるべきか、別メソド発行で別途取得すべきか…どういう形が一番綺麗なのか、非常に悩むところ。

 だいたいこのへんからfuelphpのModel_Crudにいらつきを感じ始めた。Model_Crudはpre_findを上手いこと実装したらJOINで検索かけることもできる。でもこのpre_findはcountに於いては利用されないから,検索はできるけど件数は取得できないみたいなお粗末な事になってくる。Core書き換えるなんて正気の沙汰じゃないから,とりあえずcountだけコピペして継承先で上書きしときましたが…

 とりあえずpre_findとかpre_saveとかその辺が凄いごちゃごちゃしてきたので、ちょっとその辺は見なおしていく必要あるかなぁ…と。

CMM 進捗

 とりあえずバックエンドはだいたい終わり。フロントもざっくり片付きそうな目処もついて後はデザインを軽く当てこめば公開できるかも…

 でもまぁ実際にはテーブルにインデックス張ったりとか、CLIに-hオプションとか-vオプションとかつけていないし,異常系の捌き方もまだまだだし、色々と不備だらけなんだけどやっぱり自前CMSは気持ちがいいもんです。まぁ個人的にはバックエンドが綺麗に動いた時点でもうかなりのところ満足なわけなんですが。

あとがき

 またまた

  • Model_Crudas_object(get_called_class())にはちょっとした殺意が湧いた。ここは自由に設定サせてくれてもいいんじゃないの?→pre_findで変更できるかも…あとで気が向いたら試す。
  • (array)型のキャストとかが有るらしい。foreachする時とかめちゃクチャ便利だけどこんなのが許されるってのにはちょっと違和感。
  • DBクラスのexecuteの戻り値。updateに関する既述がドキュメントになかった。結果は更新された行。実際に更新された行数で同値更新は含まないみたい。
  • コンソールアプリ、もうちょっと色つけたりしたいなぁ。
  • execとsystemの違いがあんまり分かんない。つーかなんでsh?