PHPのフレームワークを作ってみる【第1回】

大げさなタイトルですが、何回かに分けてライブラリを作っていき、最終的にある程度使えるフレームワークができれば面白いかな~という安易な企画です..。

現在、PHPのフレームワークは既に数多くあります。それらを使っていくというのは車輪の再発明をしないという意味や、誰かとの共同作業を行う場合の統一という意味でもたぶん正しいことだと思います。

今回の企画は、もちろん使えるものを作りますが、あくまで研究・実験的な要素が強く、実際の案件では既に普及している、十分にテストされたものを使用すべきだと思っています。

毎回、何らかのコードベースのものが作れたらと思いますが、どうなることやら。。

フレームワークとは..

フレームワークというのは開発を行うための枠組みとなるライブラリのことで、今回は主流となっているMVC+フロントコントローラパターンで実装しようと思います。

機能一覧

実装予定の機能としては、以下のものを考えています。

  • Model部分に簡易ORマッピング可能なライブラリを実装
  • データベース抽象化レイヤで用いるライブラリを可変に(adodbやPEAR::MDBなど切り替え可能)
  • Viewとして独自のStrutsに似た書法のテンプレートをデフォルトで利用
  • View周りのエンジンも切り替え可能に
  • ロギング機能
  • 設定ファイルはYAMLを用いてキャッシュ可能に

とりあえず、当面はこんなところで。将来的にはscaffoldingとかも取り入れたら面白いかもしれません。

ディレクトリ構造を考える

結構作りこんでいくと、なかなか変更しづらくなるのがこのディレクトリ構造だと思いますので、最初のうちに決めちゃいたいと思います。(サブディレクトリとかは増えるかもしれませんし、結局暫定的なものですが..。)

/
├─cache             (キャッシュファイル保存用)
├─htdocs            (ドキュメントルート)
├─lib               (フレームワークライブラリ格納)
│  ├─Controller    (コントローラ関係)
│  ├─File          (ファイル処理関係)
│  ├─Http          (HTTP周りの処理)
│  ├─Logging       (ロギング関係)
│  ├─Mail          (メール処理関係)
│  ├─Model         (モデル処理関係)
│  └─View          (ビュー処理関係)
├─logs              (ログファイル保存用)
└─webapp            (各プロジェクトごとのプログラムが入る)
    └─[project name]
        ├─actions   (アクションクラス)
        ├─beans     (フォームbeanクラス)
        ├─config    (設定ファイル)
        ├─filters   (フィルタクラス)
        ├─logics    (ビジネスロジッククラス)
        ├─models    (モデルクラス)
        └─templates (テンプレートファイル)

とりあえず、今回は lib/Http 内に HttpRequest.php という名前でHTTPリクエストをあらわすクラスを作成します。

HttpRequestクラス

これは、HTTPのリクエストつまりフォームなどから送られてきたユーザの要求データを処理するためのクラスとなります。まずは、これらの値をget,setできることとmethod名の取得ができるように実装してみます(後々、メソッドを追加していくことになるとは思います)。

<?php
/**
 * @class  HttpRequest
 * @brief  HTTPプロトコルのリクエストクラス
 * @author Daijiro Abe
 * @daate  2007.07.17
 */

class HttpRequest
{
    const GET  = "GET";
    const POST = "POST";
    
    private $params     = array();
    private $attributes = array();
    
    /**
     * コンストラクタ
     */
    public function __construct()
    {
        $this->params = $_GET;
        $this->params = array_merge($this->params, $_POST);
    }
    
    /**
     * パラメータの値を取得します
     * @param $name パラメータ名
     * @return パラメータの値。ない場合はnull
     */
    public function getParameter($name)
    {
        if(isset($this->params[$name]))
            return $this->params[$name];
        else
            return null;
    }
    
    /**
     * パラメータの値を設定します
     * @param $name  パラメータ名
     * @param $value 値
     */
    public function setParameter($name, $value)
    {
        $this->params[$name] = $value;
    }
    
    /**
     * パラメータを連想配列で返します
     * @return パラメータの配列
     */
    public function getParameterMap()
    {
        return $this->params;
    }
    
    /**
     * HTTPメソッドの名前を返します
     * @return HTTPメソッドの名前
     */
    public function getMethod()
    {
        return $_SERVER["REQUEST_METHOD"];
    }
}

最後の ?> がないのは、意図しないホワイトスペースを出力してしまうのを防ぐためで、クラス定義の場合は必ずこのようにした方がいいと思います。

まだ、全然本題に入れてませんが、今日はここまで。。

次回は、HttpResponseクラスの定義と設定ファイルまわりの処理なんかをやろうかなと思います。

LINEで送る
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です