2012年2月3日金曜日

AmidaMVC:設計方針を決める

さてコントローラーのアミダ式チェーンが出来たので、
今度は中身のフレームワーク。

HTTPのリクエストはコントローラーが受け取り、
コンポーネントを次々と実行する。

で、コンポーネントで何をするか?
まずは、
  1. リクエストから読み込むファイルを探して、
  2. ファイルを読み込んで、
  3. テンプレートに流し込んで、出力。
これが最低必要な流れでしょう。
それぞれ、Router、Loader、そしてRenderという名前のコンポーネントを開発することにしました。
試してませんが、今でもこの3つのコンポーネントだけで動くんじゃないかな?

Router

コントローラーからpath_infoを読み込む。
単純に最後のパスがファイル名で、残りがフォルダー名。
で、探し出せればLoaderにファイル情報を渡す。 
今はルートマップから探索できるようになりました。どちらの方法でもファイルが見つから無ければPageNotFoundにアクションを変更。 

Loader

ファイル情報からファイルの中身を読み込む。
拡張子から中身の種別を判断(HTML、markdown、テキスト、PHPのソースコード)したうえで読み込む。
PageNotFoundの場合は、前もって決めておいたファイルを読み込む。最初、ファイルはLoader内に直書きしてたが、今は設定コンポーネント(Config)で設定するよう変更済み。ファイルが正常に読み込めれば、アクションをデフォルトに戻してRenderに処理を渡す。

Render

中身の種別により、マークダウンならHTMLに、テキストならnl2brとhtmlspecialcharsをかけて、PHPならソースコードハイライトして、と前処理を行う。

それから中身のデータをテンプレートに流し込む。
とにかく簡単に。単なるPHPをインクルードするだけ。

◆$siteObj

コンポーネントで色んなデータを扱う必要があるので、必要な情報は全部このオブジェクトにぶち込んで、コンポーネント間で持ち回します。デザインパターンで言えばData Transfer Objectですな。

◆Toolsフォルダー

コンポーネントが行う実際の処理はここに書く。
コンポーネントは、処理を行うルーチンを呼び出すのが仕事。

こういう汎用的なルーチンは再発明しても仕方ないので、出来るだけ自分で書かないのが方針。実際、『パーフェクトPHP』のフレームワークの章から、ほとんどのコードを書き写しました。とても参考になったいい本だと思います。

理想はsymfonyなどのフレームワークのライブラリを再利用できるといいな。

◆以上、簡潔に方針をまとめると
・コントローラーは単純に、
・コンポーネントは薄く、
・ツールは汎用的かつコピペで書く、
のが開発方針です。

0 件のコメント: