<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


フレームワークの知見

さて自分で作って自分で仕事に使っているPHPのWebフレームワーク、目的はただ一つ、

コードを一行でも少なくすることにより、早く帰る+家で徹夜しない
という崇高なものなのに、ムチャな納期でもギリギリ請け負えてしまうため結局家で仕事する羽目に陥ってるという。いや、でも、ここは改善していけるはず。ていうか改善しないならわざわざ会社やってる意味がない。

さて、一般公開に向けて水面下でチマチマ準備しているけれど、それに先がけてというかなんというか、作って使ってみて「ああ、なるほど」と思ったWebフレームワーク一般に応用可能かもしれないことをいくつか。

・DB規約は絶対必要
 RDBを使うアプリケーションなら、DB規約と、規約に従ったテーブルを便利に扱うクラスは絶対必要。「どんなテーブルでも扱えるように」肥大化したクラスなんか邪魔。規約に従ってないテーブルには、SQL直打ちで対処。もちろん、PEAR:MDB2みたいな抽象化レイヤーはありがたーく使わせて貰ってます。
RDBの定義ルール - とっくりばー


・一覧画面をいかに楽にするか
 一覧画面をなるたけ楽に作れるようにする仕掛けはAPIのセンスの見せ所。


・一つのファイルで複数の画面・機能=幸せ
 たとえば「編集画面」と「DB登録処理」みたく、関連する2つの画面で共通点が多いとき、「1ファイル1画面」だったら、共通処理をまた別のファイルに書いて3ファイル必要になる。「1ファイル複数画面」だったら、共通処理は単にメソッドを一つ増やすだけでいいので見通しも良いし楽ちん。


・WHERE節を生成するAPIに凝る
 長いことかけて熟成してきたWHERE節生成メソッド。現在は
$where = DBUtil::whereCruise(array(
array(
'YEAR(modified_time) >=' => $yfrom,
'MONTH(modified_time) >=' => $mfrom
),
'OR name LIKE' => $db->wild($name), // %$name%になる。もちろん$name部はサニタイズする
));
なんてカンジでWHERE節が作れる。ここだけすでに別言語みたいに。でも文字列でゴリゴリ書くとSQLインジェクション対策とか、条件分岐のコードが汚くなったりとか、やっぱり良いこと無いからね。


・UPDATEとかINSERTとかDELETEとか書かないで済むようにする
MDB2_ExtendedのautoExecuteも長すぎて鬱陶しいからラッパーにしましょ。あと保存するレコードにidが入ってたらUPDATEで、入ってなかったらINSERTとか自動で判断するのもイカす。


・CSVダウンロード用クラスは一覧画面用クラスと似たAPIにする
結局の所、RDBになんかの条件でSELECT飛ばして帰った結果になにか細工して出すわけだから。


・viewのヘルパーに凝る
Smartyのhtml_optionsとかがすごい便利だってことは、ほかにも作れば便利になるものいろいろアルヨ。ってわけで、画像アップロード用ヘルパーとか、日付入力用ヘルパーとか、誕生日から年齢を算出するヘルパーとか、作ってみるとviewのコードがあら1行に収まるじゃないの。

年齢:{$person.birthday|age}歳
なんて書くとRDBに入ってた誕生日を元に年齢を表示するのです。


・キャッシュを利用する
PEAR::Cache_Liteモリモリ使わせていただいてます。マスターテーブルの内容をキャッシュしといていちいちRDBアクセスしないで中身を取り出すとかすごい便利。<select>タグを作るhtml_optionsに渡すための連想配列を一行で生成できるようにしてみた。
$prefOptions = MasterUtil::assoc('pref', 'pref_name')
なんて書くとprefテーブルからpref_idとpref_nameとってきた連想配列が得られるのです。キャッシュの有効期限は30分。マスタ編集画面なんかでは明示的にキャッシュを消すようにすればリアルタイム性も問題なし。


・フレームワーク自体を超薄型にする。
根幹に関わる部分はたぶん300行行ってない。で、規約とヘルパークラスを充実させる。フレームワークは必要最小限のことしかしない。


・出力形式ごとのメソッド名ルールは殊の外具合が良い
たとえば
http://hostname/member/edit_confirm.html
というリクエストで
(path)/member/.code/Edit.php

Member_Edit#confirm_html()
が呼ばれて、smartyテンプレート名を返せばHTML出力が走り、
http://hostname/member/edit_validate.json
というリクエストで
(path)/member/.code/Edit.php

Member_Edit#validate_json()
が呼ばれて、trueを返せばJS側の処理が続行される。

HTMLを表示するメソッドとバリデーションを行うメソッドが同じクラスに共存できて、なおかつeclipseのメソッド一覧が見やすくて、拡張子によって違う返値のルールを持てる。素晴らしい。
プログラムコードとURLの関係 - とっくりばー


・認証系に必要なメソッド、イベント
1. 「このページは認証が必要」と宣言するメソッド
2. 認証に関わりなく、必ず呼ばれるイベント(ここで上記1のメソッドを宣言すればアプリケーション全体に鍵をかけられる)
3. 「認証ユーザーがアクセスした」イベント
4. 「認証が必要だが認証されていない」イベント
5. 「認証が必要で、usernameとpasswordが送信され、認証成功した」イベント(その後3のイベントも発火する)
6. 「(同上)認証失敗した」イベント(その後4のイベントも発火する)


長くなってしまったけど、とりあえずこんなところ。


この記事に対するコメント

この記事に対するコメントの投稿



管理者にだけ表示を許可する

この記事に対するトラックバック

トラックバックURL
http://tockri.blog78.fc2.com/tb.php/136-ba2d9240
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。