Diffs
CASORA/trunk/Documents/casora_document_09_Session.txt
@@ -0,0 +1,92 @@
+ 第9章 Session
+
+■9.1. 概要
+
+ PHP で書かれたウェブアプリケーションでは、セッション を使用して
+ サーバ側 (状態を保持するデータ) とクライアント側 (特定のユーザエージェント。たとえばウェブブラウザ)
+ の論理的な一対一の関係を表します。
+ Session はセッションデータの管理と保持を行い、同一クライアントからの複数ページにわたるリクエストを扱います。
+
+ このコンポーネントのドキュメントにおいて「セッションデータ」という用語は、
+ $_SESSION に保存されたり、 Session で管理されるデータをさすものとします。
+ これは、文字列をキーとした連想配列形式で実装されています。 (通常の PHP の配列と同じです)。
+
+ Session は、session_set_save_handler() を使用し、PHPのコアに含まれているデフォルトのセッション関数を上書きします。
+
+
+■9.2. セッションの保存先
+
+ 現在対応しているのは、以下の通りです。
+
+ file … ローカルサーバでのファイルによる保存
+ cookie … クッキーによる保存
+ db … データベースによる保存
+ memcached … memcached *1 による保存
+
+ *1 memcached については公式サイト http://www.danga.com/memcached/ を参照してください。
+
+■9.3. 設定可能なパラメータ
+
+ Session の設定用のメンバ変数はstaticなので、最初にパラメータを設定すれば、
+ どのスコープでも、同じ設定でのインスタンスを取得することができます。
+
+ setParamater() メソッドを使用し連想配列で引数を指定します。
+
+ 設定変更のできる項目は以下の通りです。
+
+ [use_trans_sid]
+ 透過的なセッション IDの付加をするかどうか。
+
+ 1(有効) 0(無効)
+
+ 【デフォルト】
+ 1
+
+ [name]
+ セッション名。
+ アルファベット文字のみで指定する必要があります。
+
+ 【デフォルト】
+ PHPSESSID
+
+ [gc_maxlifetime]
+ データが 'ごみ' とみなされ、消去されるまでの秒数。
+ ガベージコレクション (ごみの収集) は、 セッションの開始時に行われます。
+
+ 【デフォルト】
+ null
+
+ [cache_expire]
+ キャッシュされた セッションページの有効期間(分単位)
+
+ 【デフォルト】
+ null
+
+ [save_path]
+ セッションデータ保存パス
+ セッションの保存先に「file」を選択した場合の、ファイルが作成される場所のパスになります。
+
+ 【デフォルト】
+ null
+
+■9.4. 基本的な使用法
+
+ 以下にデータベースをセッションの保存先として使用した場合の使用例を示します。
+
+ require_once('FW/Session.class.php');
+
+ Session::setParamater( array( 'use_trans_sid' => 1,
+ 'name' => 'PHPSESSID',
+ 'cache_expire' => 120,
+ 'gc_maxlifetime' => 7200 ) );
+
+ $Session = Session::getInstance( 'db' );
+
+ $Session->start($_COOKIE['PHPSESSID']);
+
+ if ( !isset($_SESSION['id']) ) {
+ $Session->destroy();
+ throw new Exception('セッションが切れました。');
+ }
+
+ $Session->close();
CASORA/trunk/Documents/casora_document_08_DB.txt
@@ -0,0 +1,153 @@
+ 第8章 DB
+
+■8.1. 概要
+
+ DB とその関連クラス群は、「casora」 において SQL データベースとのインターフェイスを担当します。
+ DBクラス は、PHP アプリケーションから RDBMS に接続する際に使用する
+ PHP Data Objects(PDO)をラップしたクラスです。
+
+ DBを使用するためには、PHPコンパイル時に、それぞれ使用するRDBMSの拡張モジュールを指定しておく必要があります。
+
+ * IBM DB2 および Informix Dynamic Server (IDS) (pdo_ibm PHP 拡張モジュールを使用)
+ * MySQL (pdo_mysql PHP 拡張モジュールを使用)
+ * Microsoft SQL Server (pdo_mssql PHP 拡張モジュールを使用)
+ * Oracle (pdo_oci PHP 拡張モジュールを使用)
+ * PostgreSQL (pdo_pgsql PHP 拡張モジュールを使用)
+ * SQLite (pdo_sqlite PHP 拡張モジュールを使用)
+
+■8.2. 機能
+
+ ・簡単なO/Rマッパーが実装されています。(8.4. で解説)
+
+ ・複数のホストを指定することで、ランダムに接続し、負荷分散する機能を備えています。
+
+ ・DB はマスタースレーブのレプリケーション構成を対象として作成されています。
+
+ ・DB はLoggerクラスに依存しています。
+
+ ・DB はスレーブサーバへの接続として取得したインスタンスで、
+ 更新クエリを実行した場合に例外(DBException)を発生させます。
+
+ ・インスタンスの生成(getInstance() メソッド)はシングルトンパターンで実装されています。
+
+
+■8.3. 設定可能なパラメータ
+
+ DB はstaticなクラスなので、最初にパラメータを設定すれば、
+ それ以後は毎回設定せずに、最初の設定内容でインスタンスを取得することができます。
+
+ setParamater() メソッドを使用し連想配列で引数を指定します。
+
+ 設定変更のできる項目は以下の通りです。
+
+
+ [Master]
+ マスターとなるサーバのIPまたはホスト名
+
+ 以下のいずれかの文字で区切ることにより複数記述することができます。
+ 半角スペース、ハイフン(-)、シャープ(#)、カンマ(,)、スラッシュ(/)
+
+ [Slave]
+ スレーブとなるサーバのIPまたはホスト名
+
+ 以下のいずれかの文字で区切ることにより複数記述することができます。
+ 半角スペース、ハイフン(-)、シャープ(#)、カンマ(,)、スラッシュ(/)
+
+ [Type]
+ RDBMSのタイプ
+
+ 【対応している出力】
+
+ ドライバ名 サポートされるデータベース
+ PDO_DBLIB FreeTDS / Microsoft SQL Server / Sybase
+ PDO_FIREBIRD Firebird/Interbase 6
+ PDO_IBM IBM DB2
+ PDO_INFORMIX IBM Informix Dynamic Server
+ PDO_MYSQL MySQL 3.x/4.x/5.x
+ PDO_OCI Oracle Call Interface
+ PDO_ODBC ODBC v3 (IBM DB2、unixODBC そして win32 ODBC)
+ PDO_PGSQL PostgreSQL
+ PDO_SQLITE SQLite 3 と SQLite 2
+
+ [Name]
+ RDBMSのデータベース名
+
+ [User]
+ RDBMSに接続するユーザ名
+
+ [Pass]
+ RDBMSに接続するユーザ名のパスワード
+
+ [Option]
+ ドライバ固有の接続オプション
+
+ 連想配列で指定する
+
+ 【デフォルト】
+ array(PDO::ATTR_ORACLE_NULLS => PDO::NULL_EMPTY_STRING,
+ PDO::ATTR_AUTOCOMMIT => TRUE,
+ PDO::ATTR_CASE => PDO::CASE_NATURAL,
+ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
+
+ ※詳細はPHPのドキュメントを参照してください。
+
+ [_fromEncoding]
+ エンコード元の文字コード
+
+ RDBMSに登録されているデータの文字コードに当たります。
+
+ [_toEncoding]
+ エンコード後の文字コード
+
+ ソースコードの文字コードに当たります。
+
+ [Debug]
+ デバッグフラグ
+
+ DBクラス内での挙動をログに出力します。
+
+■8.4. RDBMSへの接続とデータの取得
+
+ まずは setParamater() メソッドで接続の設定を行います。
+
+ require_once('FW/DB.class.php');
+
+ DB::setParamater( array( 'Master' => '192.168.0.2',
+ 'Slave' => '192.168.0.3',
+ 'Type' => 'mysql',
+ 'Name' => 'test',
+ 'User' => 'cassis',
+ 'Pass' => 'orange',
+ '_fromEncoding' => 'EUC-JP',
+ '_toEncoding' => 'UTF-8',
+ 'Debug' => DB::DEBUG_ON ) );
+
+ 次に接続とクエリの実行例を条件別で示します。
+
+ 例1 スレーブに接続し、query()メソッドを使用します。
+
+ $DB = DB::getInstance( DB::SLAVE );
+ $data = $DB->query('SELECT * FROM test')->fetchAll(PDO::FETCH_OBJ);
+
+
+ 例2 スレーブに接続し、プリペアードステートメントを使用します。
+
+ $DB = DB::getInstance( DB::SLAVE );
+ $DB->prepare('SELECT * FROM test WHERE id = :id');
+ $DB->bindParam( ':id', $id );
+ $DB->execute();
+ $item = $DB->fetchObject();
+
+ ※prepareのインスタンスは、DBクラスのメンバ変数で保持しています。
+
+
+ 例3 マスターに接続し、easy_mapper() メソッドを使用します。
+
+ $DB = DB::getInstance( DB::MASTER );
+ $data = $DB->easy_mapper('update', 'test', array('delete_flag' => 1), array('guest_id' => 1) );
+
+ ※easy_mapper()(拡張メソッド)はprepare() メソッドをラップした簡易マッパーです。
+ 詳しくはソースコードを参照してください。
+
+
+ その他、PDOの使用方法については、PHPのドキュメントを参照してください。
CASORA/trunk/Documents/casora_document_02_Setting.txt
@@ -0,0 +1,63 @@
+ 第2章 設定内容の詳細
+
+■2.1. 動作に必要な定数
+
+ 「casora」を動かすためには、以下の定数を定義しなければいけません。
+
+
+ [BASE_DIR] … 基本ディレクトリ
+
+ ・ソースコード、ログなど、一式置かれるディレクトリ
+ ・プロジェクトごとのディレクトリになる。
+
+ [APP_DIR] … アプリケーションディレクトリ
+
+ ・プロジェクト内のアプリケーションごとのディレクトリ
+
+ [LIB_DIR] … ライブラリのディレクトリ
+
+ ・PHPのinclude_pathで指定する必要がある。
+ ・「casora」を「FW」というディレクトリ名で置いたりする
+
+ [ROOT_DIR] … ドキュメントルートディレクトリ
+
+ ・Webからアクセスされるドキュメントルートのディレクトリ
+
+ [CONF_ROOT_DIR] … 全体の設定ファイルディレクトリ
+
+ ・プロジェクト共通で使用されるような、値や定数が定義されているファイルを
+ 置くディレクトリ
+
+ [LOG_DIR] … ログディレクトリ
+
+ ・ApacheのアクセスログやPHPのエラーログなどのディレクトリ
+
+ [CACHE_DIR] … キャッシュディレクトリ
+
+ ・Viewで表示した内容等のキャッシュファイルを置くディレクトリ
+
+ [MODELS_DIR] … モデルディレクトリ
+
+ ・アクションクラスファイルを置くディレクトリ
+
+ [VIEWS_DIR] … ビューディレクトリ
+
+ ・Viewテンプレートがファイルを置くディレクトリ
+
+ [CONF_APPS_DIR] … 各アプリケーションの設定ファイルディレクトリ
+
+ ・各アプリケーションのみにしか使用されない値を定義したファイルや、
+ casoraの初期設定値を定義したファイルを置くディレクトリ
+
+ [TEMPLATE_CHARSET] … テンプレートの文字コード
+
+ ・Viewテンプレートの文字コード
+
+ [DATABASE_CHARSET] … データベースの文字コード
+
+ ・データベースに保存されているデータの文字コード
+
+ [PROGRAM_CHARSET] … プログラムの文字コード
+
+ ・ソースコードの文字コード
+
CASORA/trunk/Documents/casora_document_01_Introduction.txt
@@ -0,0 +1,137 @@
+ 第1章 Cassis Orange の紹介
+
+■1.1. 概要
+
+ Cassis Orange(以下「casora」と呼ぶ) は中品質なオープンソースのフレームワークです。
+ WebアプリケーションやWebサービスを PHP で開発するために作成されました。
+
+ 素人が書いたコードなので、特に難しい処理はしておらず、
+ PHP初心者でも簡単に扱えて、簡単に改造できます。
+
+ 某PHPフレームワーク、「●aple」と「●end Framework」をリスペクトしています。
+ ただし、バグの少なさはリスペクトできていません。
+
+ まだまだ発展途上なので、ご使用はオススメしません。
+
+
+■1.2. インストール
+
+ 「casora」は PHP 5 のオブジェクト指向機能を使用しており、
+ PHP 5 以降でないと動作しません。
+
+ 適切な PHP 環境が用意できれば、次は 「casora」 を取得します。
+ これは、以下のいずれかの方法で取得することができます。
+
+ ・最新の安定版をダウンロードする。
+ このバージョンは .tar.gz の形式で公開されており、
+ 「casora」をはじめて使う人におすすめです。
+
+ http://cassisorange.com/download.html
+
+ ・最新のスナップショットをダウンロードする。
+ 最先端の機能を試してみたいという勇気ある人たちのために、
+ 「casora」の最新の開発版のスナップショットをたまに更新しています。
+
+ http://cassisorange.com/svn/
+
+ ※「casora」の各コンポーネントは疎結合で、
+ 必要に応じて特定のコンポーネントのみを使用するようにしたいです。
+ 現在は定義した定数をクラス内で使用しているため、依存関係が乱れています。
+
+■1.3. 導入
+
+ 最小構成のファイルシステムレイアウトは以下のようになります。
+
+ ※アプリケーション名を「sample」、ページ名を「top」とした場合。
+
+ casora/
+ ├─sample/
+ │ ├─models/
+ │ │ └─Top.class.php
+ │ └─views/
+ │ └─top.html
+ ├─html/
+ │ └─index.php
+ └─FW/
+ ├─Controller.class.php
+ ├─Logger.class.php
+ ├─Log.php
+ └─Log/
+
+ 上記の「casora」というディレクトリはプロジェクトに当たるもので、
+ その中に存在するアプリケーション(例えば会員登録など)にあたるのは「sample」になります。
+
+ パッケージ化するためには、「casora」ディレクトリ内に集約させることになります。
+ (casora・sampleという名前は適宜変更してください)
+
+
+ アプリケーションのログの保存や、設定ファイルを別ファイルに切り出した場合、
+ 典型的なレイアウトは、次のようなになります。
+
+ casora/
+ ├─config.inc.php
+ ├─conf/
+ │ └─log.inc.php
+ ├─apps/
+ │ └─sample/
+ │ ├─config.inc.php
+ │ ├─html/
+ │ │ ├─sample
+ │ │ └─.htaccess
+ │ ├─logs/(Webアプリケーションが書き込める権限にする)
+ │ ├─models/
+ │ │ └─Top.class.php
+ │ └─views/
+ │ └─top.html
+ └─lib/
+ ├─FW/(casoraフレームワーク)
+ │ ├─Controller.class.php(必須)
+ │ └─Logger.class.php(必須)
+ ├─Log/
+ └─Log.php(PEAR)
+
+ ※アプリケーション名を「sample」、ページ名を「top」とした場合。
+ ※アプリケーションごとに、ドキュメントルートを分けた構成。
+
+ 上記2つの例は、必ず構築しなければいけない構成ではありません。
+ 定義する定数により構成の変更が可能です。
+
+
+ 各ディレクトリの意味と内容は以下の通りです。
+
+ conf/
+ 設定ファイル
+ 各アプリケーション共通で使用するファイル
+
+ lib/
+ ライブラリ
+ 全体で使用するライブラリ
+
+ [apps]/
+ アプリケーション
+ 管理画面、フロントなど必要な分だけ作成する
+
+ [apps]/html/
+ 各アプリケーションのWebのドキュメントルート
+
+ [apps]/conf/
+ 設定ファイル
+ 各アプリケーション共通で使用するファイルを置く
+
+ [apps]/log/
+ ログ
+ Apacheやロガーで吐き出すログなどを置く。
+
+ [apps]/model/
+ モデル
+ ページを表示するためのクラスを置く
+
+ [apps]/view/
+ ビュー
+ テンプレート置き場
+
+ [apps]/config.inc.php
+ 各アプリケーションの設定ファイル
+
+
+ とにかく実際に動かしてみたいという場合は、「付録A チュートリアル」を参照してください。
CASORA/trunk/Documents/casora_document_04_Router.txt
@@ -0,0 +1,42 @@
+ 第4章 Router
+
+■4.1. 概要
+
+ Router(ルーター)は、URI (ベース URL から取得した URI の一部) を展開し、
+ どのアプリケーションの、どのアクションが リクエストを処理するのかを決める処理をします。
+ ルーティングが行われるのは一度だけ、すなわちリクエストを最初に受け取ってから
+ 最初のコントローラに処理が渡される際だけです。
+
+■4.2. Routerの使用法方
+
+ Routerは ROUTER_TYPE 定数を定義していればコントローラが勝手に実行します。
+
+ ※ROUTER_TYPE 定数が定義されていない場合、Routerが例外を吐きます。
+
+■4.3. デフォルトのRouter
+
+ デフォルトのRouterとして、Router_defaultというクラスが組み込まれいます。
+
+ 展開されるURIのフォーマットは、
+ http://ホスト/アプリケーション/パス/アクション/var1=value1&var2=value2
+ となっています。
+
+ 以下に、URIのマッチ処理についての例を示します。
+
+ ・リクエストされたURI
+ http://cassisorange.com/sample/drink/tea/order=tea&salesman=2
+
+ ・配送されるアクションクラス
+ casora/sample/models/drink/Tea.class.php
+
+ ・読み込まれるView(アクションクラスが'tea'というViewを返した場合)
+ casora/sample/views/drink/tea.html
+
+ ※アプリケーションディレクトリの models・views ディレクトリが基点となる。
+
+■4.4. オリジナルRouterの作成
+
+ Routerはそれぞれのシステムに合ったRouterを作成することができます。
+
+ 今回は省略します。
+
CASORA/trunk/Documents/casora_document_A_Tutrial.txt
@@ -0,0 +1,167 @@
+ 付録 A チュートリアル
+
+ とりあえず動かしてみたいという方は、ここを読むといいでしょう。
+
+■A.1. ディレクトリ構成
+
+ まずはディレクトリ構成を決めましょう。
+
+ casora/
+ ├─config.inc.php
+ ├─conf/
+ │ └─log.inc.php
+ ├─sample/(アプリケーション名)
+ │ ├─config.inc.php
+ │ ├─logs/(Webアプリケーションが書き込める権限にする)
+ │ ├─models/
+ │ │ └─Top.class.php
+ │ └─views/
+ │ └─top.html
+ ├─html/
+ | ├─sample
+ │ └─.htaccess
+ └─lib/
+ ├─FW/
+ │ ├─Controller.class.php
+ │ └─Logger.class.php
+ ├─Log/
+ └─Log.php
+
+ ※アプリケーション名を「sample」、ページ名を「top」とした場合
+ ※アプリケーションのドキュメントルートを1つにまとめる場合。
+
+■A.2. ドキュメントルートの設定
+
+ ウェブサーバのドキュメントルートを、casora/html ディレクトリに設定します。
+
+■A.3. 入り口ファイルの作成
+
+ このファイルを通して、すべてのクラスやViewを表示することになります。
+ 設定ファイルを読み込み、コントローラーを実行します。
+
+ casora/html/sample
+
+ define( 'APPLICATION_NAME', 'sample' );
+ require_once( realpath('../').'/'.basename($_SERVER['SCRIPT_FILENAME']).'/config.inc.php');
+ Controller::execute();
+
+■A.4. rewrite ルールの作成
+
+ casora/html/.htaccess ファイルを、次のように編集します。
+
+ <Files sample>
+ ForceType application/x-httpd-php
+ </Files>
+
+ ※注意 rewrire ルールは Apache 用のものです。
+
+■A.5. 設定ファイル(プロジェクト全体用)の作成
+
+ casora/config.class.php で「casora」を動かすために必要な定数を定義します。
+
+ <?php
+ /* フレームワーク必須設定 -------------------------------------------------- */
+ define('BASE_DIR', '/path/to/casora' );
+ define('APP_DIR', BASE_DIR.'/apps/'.APPLICATION_NAME );
+ define('LIB_DIR', BASE_DIR.'/lib' );
+ define('ROOT_DIR', BASE_DIR.'/html' );
+ define('CONF_ROOT_DIR', BASE_DIR.'/conf' );
+ define('LOG_DIR', APP_DIR.'/logs' );
+ define('MODELS_DIR', APP_DIR.'/models' );
+ define('VIEWS_DIR', APP_DIR.'/views' );
+ define('CONF_APPS_DIR', APP_DIR.'/conf' );
+
+ /* 文字コード --------------- */
+ define('TEMPLATE_CHARSET', 'UTF-8' );
+ define('DATABASE_CHARSET', 'UTF-8' );
+ define('PROGRAM_CHARSET', 'UTF-8' );
+
+ ini_set( 'include_path', ini_get('include_path').':'.LIB_DIR);
+ require_once(APP_DIR.'/config.inc.php');
+
+ /* ルーター ----------------- */
+ define('ROUTER_TYPE', 'default' );
+ require_once('FW/Router.class.php');
+
+ /* テンプレートエンジン ----- */
+ define('VIEWER_TYPE', 'default' );
+ require_once('FW/Viewer.class.php');
+
+ /* コントローラー ----- */
+ require_once('FW/Controller.class.php');
+
+
+ 定数の役割や内容については第2章「2.1. 動作に必要な定数」を参照してください。
+
+
+■A.6. 設定ファイル(ログ用)の作成
+
+ casora/config/log.inc.php でロギングするための定数を定義します。
+
+ <?php
+ define( 'LOG_HANDLER', 'file' );
+ define( 'LOG_FILENAME', LOG_DIR.'/php_script.log' );
+ define( 'LOG_LEVEL', PEAR_LOG_DEBUG );
+
+ ※ 上記は casora/sample/logs/php_script.log にカソラのデバッグレベルの実行ログを
+ 吐くようにするための設定です。
+
+■A.7. 設定ファイル(各アプリケーション用)の作成
+
+ casora/sample/config.class.php で各アプリケーションごとにを使用する定数の定義や、
+ 初期設定をします。
+
+ <?php
+ define('SITE_NAME_JP', 'カソラ' );
+
+ require_once('FW/Logger.class.php');
+ require_once(CONF_DIR.'/log.inc.php');
+ Logger::setParamater( array( 'Handler' => LOG_HANDLER,
+ 'Filename' => LOG_FILENAME,
+ 'Level' => LOG_LEVEL ) );
+
+■A.8. アクションクラスの作成
+
+ casora/sample/models/top.class.php に、動作内容を記述したクラスを定義します。
+
+ <?php
+ class sampleTop
+ {
+ public function action( $requests ){
+
+ $this->message = 'Bonjour '. SITE_NAME_JP;
+
+ return 'top';
+ }
+ }
+
+ ビューでmessageという変数を使えるように、メンバ変数に定義します。
+
+ ※詳しい使い方は「第5章 アクションクラス」を参照してください。
+
+■A.9. ビューテンプレートの作成
+
+ casora/sample/views/top.html に、モデルで定義したmessageを表示するように記述します。
+
+ <html>
+ <head>
+ <title>top</title>
+ </head>
+ <body>
+ <?php echo $message; ?>
+ </body>
+ </html>
+
+■A.10. 実行
+
+ 以上で構築は完了です。
+
+ ブラウザからアクセスしてみましょう。
+
+ http://[ご使用のホスト]/sample/top/
+
+ 「Bonjour カソラ」と表示されれば、「こんにちわ」と挨拶してください。
+
+ もし表示されない場合は、casora/sample/logs/php_script.log を見てみるか、
+ Apacheのログ等を参照して原因を探してください。
+
CASORA/trunk/Documents/casora_document_B_Coding.txt
@@ -0,0 +1,197 @@
+ 付録 B「CassisOrange Framework」 PHP 標準コーディング規約
+
+■B.1. 概要
+
+ このドキュメントは、CassisOrange Framework 上で開発を行う開発者
+ (あるいは CassisOrange Framework 開発チーム) のための指針となるものです。
+
+ 基本的にはZent Frameworkのコーディング規約に従って欲しいですが、厳密には強制しません。
+
+ とりあえず、できるだけ従って欲しい項目を抜粋したので、以下に転載します。
+
+■B.2. PHP ファイルの書式
+
+■B.2.2. 字下げ
+
+ 字下げは空白 4 文字で行います。タブ文字は使用しません。
+
+■B.2.3. 1 行の長さ
+
+ 1 行の長さを 80 文字までにすることを目指しましょう。すなわち、
+ コードの長さを現実的な範囲で 80 文字までにおさめるよう努力すべきです。
+ しかしながら、少々長くなってしまうことは許されます。
+ PHP コードの行の長さは、最大 120 文字までにするようにしましょう。
+
+■B.2.4. 行末
+
+ 行末の扱いは、標準的な Unix テキストファイルの方式にあわせます。
+ 行末は、ラインフィード (LF) のみにしなければなりません。
+ この文字のコードは 10、あるいは 16 進形式で 0x0A となります。
+
+ マッキントッシュのように、キャリッジリターン (CR) を使用しないでください (コードは 0x0D です)。
+
+ Windows のように、キャリッジリターンとラインフィードの組み合わせ (CRLF) を使用しないでください (コードは 0x0D, 0x0A です)。
+
+■B.3.4. 関数およびメソッド
+
+ 関数名に含めることができるのは英数字のみです。 アンダースコアを使用してはいけません。
+ 数字を含めることは可能ですが、お勧めしません。
+
+ 関数名は小文字で始めなければなりません。 関数名が複数の単語で構成されている場合は、
+ 各単語の最初の文字を大文字にしなければなりません。
+ 一般に、このフォーマットは "camelCaps" と呼ばれています。
+
+ 関数名は省略しすぎないようにしましょう。
+ コードを理解しやすくするため、 現実的な範囲でできるだけ詳細な名前をつけるようにしましょう。
+
+
+■B.4.3. 配列
+■B.4.3.1. 数値添字の配列
+
+ array を使用して数値添字の配列を宣言する場合は、 コードを読みやすくするため、
+ 要素を区切るカンマの後にスペースを入れなければなりません。
+
+ $sampleArray = array(1, 2, 3, 'Cassis', 'Orange');
+
+■B.4.3.2. 連想配列
+
+ 連想配列を array で宣言する場合には、 適宜改行をいれて複数行で宣言するようにしましょう。
+ その場合は、 2 行目以降の行頭などにスペースを入れ、 キーと値の位置がそれぞれ揃うようにしなければなりません。
+
+ $sampleArray = array('firstKey' => 'firstValue',
+ 'secondKey' => 'secondValue');
+
+■B.4.4. クラス
+■B.4.4.1. クラス宣言
+
+ クラス宣言は、以下の規約に従わなければなりません。
+
+ 開始波括弧は常にクラス名の下に書かなければなりません ("one true brace" 形式)。
+
+ PHPDocumentor の標準形式のドキュメントブロックがなければなりません。
+
+ クラス内のコードは、すべて空白 4 文字で字下げします。
+
+ ひとつの PHP ファイルにはクラス定義をひとつだけ含めるようにします。
+
+ クラスファイルの中にクラス以外のコードを追加することもできますが、
+ お勧めしません。このような場合には、クラス定義とその他のコードの間に 空行を 2 行挿入しなければなりません。
+
+ これらの条件を満たすクラス宣言の例です。
+
+ /**
+ * これがドキュメントブロックです
+ */
+ class SampleClass
+ {
+ // クラスのすべての内容は、
+ // 空白 4 文字の字下げを使用します。
+ }
+
+
+■B.4.4.2. クラスのメンバ変数
+
+ メンバ変数は、以下の命名規約に従わなければなりません。
+
+ クラス内で宣言されるすべての変数は、クラスの最初、 つまりメソッド宣言の始まる前になければなりません。
+
+ var は使用してはいけません。メンバ変数は、常に private、
+ protected あるいは public を使用して宣言してください。
+ 変数を public にして直接アクセスすることも可能ですが、推奨されません。
+ 代わりにアクセサメソッド (set/get) を使用してください。
+
+■B.4.5. 関数およびメソッド
+■B.4.5.1. 関数およびメソッドの宣言
+
+ 関数は、以下の命名規約に従わなければなりません。
+
+ クラス内のメソッドは、必ず private、protected あるいは public のいずれかを使用して宣言しなければなりません。
+
+ クラスと同様、 開始波括弧は常に関数名の下に書かなければなりません ("one true brace" 形式)。
+ 関数名と引数指定の開始括弧の間には、空白を入れません。
+
+ グローバルスコープの関数は、できるだけ使用しないでください。
+
+ これらの条件を満たす、クラス内での関数定義の例です。
+
+ /**
+ * これがドキュメントブロックです
+ */
+ class Foo
+ {
+ /**
+ * Documentation Block Here
+ */
+ public function bar()
+ {
+ // 関数のすべての内容は、
+ // 空白 4 文字の字下げを使用します。
+ }
+ }
+
+
+ 返り値は括弧で囲んではいけません。これは可読性を下げますし、
+ 将来そのメソッドが参照を返すようになった場合にコードが壊れてしまいます。
+
+ /**
+ * これがドキュメントブロックです
+ */
+ class Foo
+ {
+ /**
+ * 間違いです
+ */
+ public function bar()
+ {
+ return($this->bar);
+ }
+
+ /**
+ * 正しい形式です
+ */
+ public function bar()
+ {
+ return $this->bar;
+ }
+ }
+
+■B.4.5.2. 関数およびメソッドの使用法
+
+ 関数の引数を指定する際は、引数を区切るカンマの後に空白をひとつ入れます。
+ 例えば 3 つの引数を受け取る関数をコールする場合の例は、 以下のようになります。
+
+ threeArguments(1, 2, 3);
+
+■B.4.6. 制御構造
+■B.4.6.1. If / Else / Elseif
+
+ if および elseif 系の制御構造では、 条件を指定する括弧の前に空白をひとつ入れなければなりません。
+ また、条件指定の括弧を閉じた後にも空白をひとつ入れなければなりません。
+
+ 括弧で囲まれた条件文の中では、演算子の前後にも空白をいれなければなりません。
+
+ 開始波括弧は、条件文と同じ行に記述します。 終了波括弧は、常に改行してそれのみで記述します。
+ 波括弧の中では、空白 4 文字の字下げを使用します。
+
+ if ($a != 2) {
+ $a = 2;
+ }
+
+
+ "elseif" あるいは "else" を含む "if" 文の場合の決まりは、 以下の例のような書式になります。
+
+ if ($a != 2) {
+ $a = 2;
+ } else {
+ $a = 7;
+ }
+
+
+ if ($a != 2) {
+ $a = 2;
+ } elseif ($a == 3) {
+ $a = 4;
+ } else {
+ $a = 7;
+ }
+
CASORA/trunk/Documents/casora_document_03_Controller.txt
@@ -0,0 +1,62 @@
+ 第3章 Controller
+
+■3.1. 概要
+
+ Controller は Model-View-Controller (MVC) アプリケーションで用いられる
+ フロントコントローラパターン を実装したものです。
+ その役割は、リクエスト環境を初期化してリクエストの配送先を決定し、
+ 見つかった配送先に処理を引き渡すことです。
+ また、レスポンスの内容を取得してそれをコール元に返します。
+
+■3.2. 依存関係
+
+ 現在、以下のクラスと定数に依存しています。
+
+ 【クラス】
+ Router
+ Viewer
+ Logger
+
+ 【定数】
+ MODELS_DIR
+ VIEWS_DIR
+ ROUTER_TYPE
+ ERROR_TEMPLATE
+
+ ※定数については「第2章 設定内容の詳細」を参照してください。
+
+■3.3. 挙動について
+
+ 以下コントローラーが行う、大まかな流れになります。
+
+ 1.Routerクラスを呼び出して、配送先のパスやリクエストを取得します。
+
+ 2.配送先のクラス(Modelsディレクトリ内のクラス。以後アクションクラスと呼ぶ)を読み込みます。
+ 読み込めない場合はビューを読み込んで終了。
+ クラスもビューも読み込めない場合はエラー(Exception)を吐く。
+
+ 3.アクションクラスのメンバ変数に、ブラウザから受け取ったリクエストを代入。
+ このタイミングで、mysql_escape_string()・htmlspecialchars()をかまし、
+ (完全ではないが)XSS、SQLインジェクションを防いでいる。
+
+ 4.アクションクラスにvaridateメソッド *1 があれば実行する。
+
+ 5.アクションクラスにactionメソッド *1 があれば実行し、表示するView *2 の名前を取得する。
+ なければエラー(Exception)を吐く。
+
+ 6.以上の流れの中でエラーが有った場合、catchで例外を捕まえて、
+ ERROR_TEMPLATE 定数で指定されたView *2 の名前を取得する。
+
+ 7.出力のバッファリングを有効にする
+
+ 8.Viewerクラスを使い、レンダリングしたHTMLを出力する。
+
+ 9.出力されたHTMLを変数に代入して、出力のバッファリングを終了する。
+
+ 10.アクションクラスにfilterメソッド *1 があれば実行する。
+
+ 11.HTMLを表示する。
+
+
+ *1 各メソッドの機能については「第5章 アクションクラス」を参照してください。
+ *2 Viewについては「第6章 Viewer」を参照してください。
CASORA/trunk/Documents/casora_document_07_Logger.txt
@@ -0,0 +1,137 @@
+ 第7章 Logger
+
+■7.1. 概要
+
+ Logger は、ログ出力用の汎用クラスです。
+ 複数のバックエンドに対応しており、ログに出力するメッセージをフォーマットしたり
+ 記録するメッセージをフィルタリングしたりすることができます。
+
+ 実は PEAR の Logパッケージをラップしただけです。
+
+■7.2. エラーレベルメソッド
+
+ 実装されているエラーレベルのメソッドは以下の通りです。
+ PEARのLogパッケージで定義されているメソッドに依存します。
+
+ function emerg($message)
+ function alert($message)
+ function crit($message)
+ function err($message)
+ function warning($message)
+ function notice($message)
+ function info($message)
+ function debug($message)
+
+■7.3. 設定可能なパラメータ
+
+ Logger の設定用のメンバ変数はstaticなので、最初にパラメータを設定すれば、
+ どのスコープでも、同じ設定でのインスタンスを取得することができます。
+
+ setParamater() メソッドを使用し連想配列で引数を指定します。
+
+ 設定変更のできる項目は以下の通りです。
+
+ [Handler]
+ 出力先ハンドル
+
+ ファイルや、標準出力、Syslogなどへの出力先の指定
+
+
+ 【対応している出力】
+ composite
+ console
+ daemon
+ display
+ error_log
+ file
+ firebug
+ mail
+ mcal
+ mdb2
+ null
+ observer
+ sqlite
+ sql
+ syslog
+ win
+
+ 【デフォルト】
+ file
+
+ [Filename]
+ ログファイル名
+
+ 「出力先ハンドル」を「file」に設定した場合のファイルの作成パス。
+
+ 【デフォルト】
+ /var/log/php_script.log
+
+ [Ident]
+ ログに出力されるID
+
+ 【デフォルト】
+ 実行しているプログラムのプロセスID
+
+ [Conf]
+ ログフォーマット
+
+ ログレコード全体のフォーマットと、時刻の部分のフォーマットがあります。
+ 指定は連想配列で指定します。
+
+ array(
+ 'timeFormat' => '%Y-%m-%d %H:%M:%S', // 時刻
+ 'lineFormat' => '[%1$s] %2$s [%3$s] %5$s:%6$s:%7$s() %4$s' // レコード全体
+ );
+
+ 【デフォルト】
+ 時刻 YYYY-MM-DD HH:mm:ss
+ レコード全体 [時刻] ID [エラーレベル] メッセージ
+
+ [Level]
+ ログ出力レベル
+
+ エラー出力する優先度。
+
+ PEARのLogパッケージで定義されている定数に依存します。
+ 優先度の数値が小さいほど優先度が高くなります。
+ EMERG (0) が最重要な優先度で、DEBUG (7) は 組み込みの優先度の中ではもっとも優先度が低いものです。
+
+ PEAR_LOG_WARNINGが設定された場合、ログとして出力されるのは、
+ PEAR_LOG_EMERG・PEAR_LOG_ALERT・PEAR_LOG_CRIT・PEAR_LOG_ERR・PEAR_LOG_WARNING
+ となります。
+
+ 【設定可能な値(定数)】
+
+ PEAR_LOG_EMERG = 0 // 緊急事態 (Emergency): システムが使用不可能です
+ PEAR_LOG_ALERT = 1 // 警報 (Alert): 至急対応が必要です
+ PEAR_LOG_CRIT = 2 // 危機 (Critical): 危機的な状況です
+ PEAR_LOG_ERR = 3 // エラー (Error): エラーが発生しました
+ PEAR_LOG_WARNING = 4 // 警告 (Warning): 警告が発生しました
+ PEAR_LOG_NOTICE = 5 // 注意 (Notice): 通常動作ですが、注意すべき状況です
+ PEAR_LOG_INFO = 6 // 情報 (Informational): 情報メッセージ
+ PEAR_LOG_DEBUG = 7 // デバッグ (Debug): デバッグメッセージ
+
+ 【デフォルト】
+ Warning(PEAR_LOG_WARNING)
+
+■7.4. ログの作成
+
+ ログの記録を開始するには、setParamater() メソッドでログ設定を行い、to()メソッドで出力します。
+ ※デフォルトの設定で出力する場合は、setParamater() を使用する必要はありません。
+
+ 以下プログラムのサンプルを示します。
+
+ <?php
+ require_once('FW/Logger.class.php');
+
+ Logger::setParamater( array( 'Handler' => 'display',
+ 'Filename' => '/home/casora/logs/log.txt',
+ 'Level' => PEAR_LOG_ERR ) );
+
+ Logger::to()->debug('DEBUG');
+ Logger::to()->warning('WARNING');
+ Logger::to()->err('ERROR');
+
+ ログは /home/casora/logs/log.txt に作成され、出力結果は以下のようになります。
+
+ [2008-07-15 18:11:18] 21572 [error] ERROR
CASORA/trunk/Documents/casora_document_00_Index.txt
@@ -0,0 +1,101 @@
+プログラマ向けリファレンスガイド
+CassisOrange Framework
+
+製作著作 c 2007-2008 RyuN Corp. (http://www.ryun.jp/)
+
+2008-07-18
+
+
+目次
+
+1. CassisOrange Framework の紹介
+
+ 1.1. 概要
+ 1.2. インストール
+ 1.3. 導入
+
+2. 設定内容
+
+ 2.1. 動作に必要な定数
+
+3. Controller
+
+ 3.1. 概要
+ 3.2. 依存関係
+ 3.3. 挙動について
+
+4. Router
+
+ 4.1. 概要
+ 4.2. Routerの使用法方
+ 4.3. デフォルトのRouter
+ 4.4. オリジナルRouterの作成
+
+5. アクションクラス
+
+ 5.1 概要
+ 5.2. 定義条件とルール
+ 5.3. メソッド
+ 5.4. メンバ変数
+ 5.5. サンプルコード
+
+6. Viewer
+
+ 6.1. 概要
+ 6.2. Viewerテンプレートの指定
+ 6.3. 使用例
+ 6.4. Viewerエンジンの切り替え
+
+7. Logger
+
+ 7.1. 概要
+ 7.2. エラーレベルメソッド
+ 7.3. 設定可能なパラメータ
+ 7.4. ログの作成
+
+8. DB
+
+ 8.1. 概要
+ 8.2. 機能
+ 8.3. 設定可能なパラメータ
+ 8.4. RDBMSへの接続とデータの取得
+
+9. Session
+
+ 9.1. 概要
+ 9.2. セッションの保存先
+ 9.3. 設定可能なパラメータ
+ 9.4. 基本的な使用法
+
+A. チュートリアル
+
+ A.1. ディレクトリ構成
+ A.2. ドキュメントルートの設定
+ A.3. 入り口ファイルの作成
+ A.4. rewrite ルールの作成
+ A.5. 設定ファイル(プロジェクト全体用)の作成
+ A.6. 設定ファイル(ログ用)の作成
+ A.7. 設定ファイル(各アプリケーション用)の作成
+ A.8. モデルクラスの作成
+ A.9. ビューテンプレートの作成
+ A.10. 実行
+
+B. 「CassisOrange Framework」 PHP 標準コーディング規約
+
+ B.1. 概要
+ B.2. PHP ファイルの書式
+ B.2.2. 字下げ
+ B.2.3. 1 行の長さ
+ B.2.4. 行末
+ B.3.4. 関数およびメソッド
+ B.4.3. 配列
+ B.4.3.1. 数値添字の配列
+ B.4.3.2. 連想配列
+ B.4.4. クラス
+ B.4.4.1. クラス宣言
+ B.4.4.2. クラスのメンバ変数
+ B.4.5. 関数およびメソッド
+ B.4.5.1. 関数およびメソッドの宣言
+ B.4.5.2. 関数およびメソッドの使用法
+ B.4.6. 制御構造
+ B.4.6.1. If / Else / Elseif
CASORA/trunk/Documents/casora_document_06_Viewer.txt
表示できません: バイナリ形式としてマークされたファイルです。
svn:mime-type = application/octet-stream
属性に変更があったパス: CASORA/trunk/Documents/casora_document_06_Viewer.txt
___________________________________________________________________
名前: svn:mime-type
+ application/octet-stream
CASORA/trunk/Documents/casora_document_05_ActionClass.txt
@@ -0,0 +1,121 @@
+ 第5章 アクションクラス
+
+■5.1 概要
+
+ アクションクラスには、Webページを表示するための処理、アクション内容を記述したメソッドを定義します。
+
+ MODELS_DIR 定数で定義したディレクトリに作成していきます。
+
+
+■5.2. 定義条件とルール
+
+ すべてはRouterに依存します。
+ 以下 Router_default クラスを使用した場合で説明します。
+
+ 【命名規約】
+
+ ・指定されたアクション名の頭文字を大文字にして、拡張子を「.class.php」にする。
+
+ 例 指定されたアクション名が「form」の場合
+
+ [MODELS_DIR]/Form.class.php
+
+ 【クラス名】
+
+ ・パス、アクション名の頭文字を大文字にして繋げる。
+
+ 例1 アクション名が「form」の場合
+
+ class Form {
+ :
+
+ 例2 アクション名が「form」の場合で、パスが「member」の場合
+
+ class MemberForm {
+ :
+
+
+ また、アクションクラス作成する場合、action()メソッドを必ず定義しなければいけません。
+ コントローラーを実行したタイミングで、自動的に呼び出されます。
+ 定義しなかった場合、コントローラーが例外を吐きます。
+
+ 他にコントローラーから自動的に呼び出される、validate()・filter() メソッドがあります。
+
+■5.3. メソッド
+
+ コントローラはアクションクラスのメソッドチェックし、
+ 以下のメソッドが存在すれば、自動的に呼び出します。
+
+ ・action()
+
+ 必須メソッド
+
+ リクエストを引数として受けとらなければいけません(変数名は何でも良い)
+
+ ・validate()
+
+ 任意メソッド
+
+ action() メソッドが実行される前に実行されます。
+ 用途は主に、リクエストされた値のバリデーションです。
+
+ リクエストを引数として受けとらなければいけません(変数名は何でも良い)
+ ※参照渡しで受け取る
+
+ ・filter()
+
+ 任意メソッド
+
+ action() メソッドが実行される後に実行されます。
+ 用途は主に、レンダリングされた Viewテンプレートの書き換えです。
+
+ Viewテンプレートをレンダリングした結果を引数として受けとらなければいけません(変数名は何でも良い)
+
+
+■5.4. メンバ変数
+
+ アクションクラスのメンバ変数に値を代入することによって、
+ Viewテンプレートで使用することができます。
+
+
+■5.5. サンプルコード
+
+ <?php
+ class Top
+ {
+
+ public function validate( &$requests )
+ {
+ if ( $requests['number'] == '' ) {
+ $requests['number'] = 0;
+ }
+
+ return;
+ }
+
+ public function action( $requests ){
+
+ $this->number = $requests['number'] / 100;
+
+ return 'top';
+ }
+
+ public function filter( $buffer )
+ {
+ return str_replace( 'Bonjour', 'Hello', $buffer );
+ }
+ }
+
+ 【動作の流れ】
+
+ 1.validate() メソッドがコントローラより呼ばれ、リクエストのnumber変数が空だった場合、
+ 「0」を代入します。
+
+ 2.action() メソッドがコントローラより呼ばれ、リクエストのnumber変数の値を100で割り、
+ その結果をメンバ変数 number に代入します。
+ Viewテンプレートには「top」を指定します。
+
+ 3.Viewテンプレートをレンダリングした結果内容にある、'Bonjour'という文字列を
+ 'Hello'に置換した内容をコントローラに返す。
+
+ 4.コントローラが3で返された内容を表示する。