mojavi howto
TRANSCRIPT
document.doc 作成日時:2004/10/20
Mojavi マニュアル
1/32
document.doc 作成日時:2004/10/20
1、 Mojaviとは? 4
2、Mojaviの初期設定 5
2,1 Mojaviのインストール 5
2,2 Mojaviの設定 5
3、最初のアプリケーション 6
3.1 HellwoWorldAction.class.phpの作成 6
3.2 HellowWorldView_success.class.phpの作成 7
3.2 HellowWorld.phpの作成 7
4、Mojaviの仕組み 8
4.1 controllerについて 8
4.1.1 Actionの命名ルール 8
4.2 Actionについて、 8
4.2.1 引数について(*4.2) 8
4.2.2 Viewの命名ルール 9
4.3 Viewについて、 9
5、少し複雑なアプリケーション 11
2/32
document.doc 作成日時:2004/10/20
5.1 とりあえずメニュー画面 12
5.2 認証と、認証チェック 13
5.2.1 認証の必要な画面の作り方 13
5.2.2 認証(ログイン)画面の作成 14
5.2.3 ほかのActionへのフォワードの仕方 16
5.2.4 ユーザーの承認状態の設定 16
5.2.5 Action->getRequestMethods()とAction->getDefaultView() 16
5.3 入力チェック(Validation) 19
5.3.1 registerValidators()と handleError 20
5.3.2 ValidatorManagerとValidator 21
5.4画面表示権限の設定とチェック 24
5.4.1 $user->addPrivilegeメソッドと、action-> getPrivlegeメソッド 24
5.5 フィルターとフィルターリスト 26
3/32
document.doc 作成日時:2004/10/20
1、 Mojaviとは?Mojavi(*1.1)とは、Mojavi Project で開発されている。オープンソース(*2.1)のフレームワークです。
MVCモデルを基本としていますが、多くのモジュールに Struts などのApache/Jakartaの影響が見受けられます。
特徴としては
* モジュールによる管理構造
* (チェーンに出来る)フィルタ機能
* ほとんどのライブラリが拡張可能(ユーザーコンテナ・バリデーション・認証/承認機能・描画機能・ログ機能)
* リクエストパラメーターと、ネーミングルールによるシンプルな画面遷移。
シンプルなMVCモデルですが、セッション機能・リクエストの処理・認証などが、デフォルトで組み込まれているので
PHPの初心者でも習得が容易なフレームワークです。
この資料ではMojaviを使ってWebApplicationを開発する方法をチュートリアル形式で紹介します。
*1.1 「モハビ」と読む
*2.1 ライセンスはLGPL
4/32
document.doc 作成日時:2004/10/20
2、Mojaviの初期設定2,1 Mojaviのインストール
(今回は)WindwsXP + Apache2.xの環境へのインストールを想定しています。
Mojavi のダウンロードサイト より適当なアーカイブをダウンロードして、適当な場所に展開してください。
(今回はVersion2.0の zipファイルを使います)
展開したファイルのwebapp以下をDocumetnRoot以下においてください。
Mojaviを試すだけなら、Apache起動時にDocumentRootをアーカイブ展開先にしてしまうほうが楽です。
例: C:\Apache\bin\Apache.exe -c "DocumentRoot C:\mojavi\webapp" -k start
2,2 Mojaviの設定
まず、webapp/config.phpを修正します。(*2.1)
* 19行目ぐらいのBASE_DIRの定義を修正します。
define('BASE_DIR', 'C:/mojavi/webapp/'); <-webappへの絶対 PATHに変更
* 32行目ぐらいのMOJAVI_FILEの定義を変更します。
define('MOJAVI_FILE', 'C:/mojavi/mojavi-all-classes.php');<- mojavi-all-classes.phpへの絶対 PATHに変更
* 37行目ぐらいのOPT_DIRの定義を変更します。
define('OPT_DIR', 'C:/mojavi/opt/');<-optへの絶対 PATH
続いてwebapp/index.phpを修正します。
* 15行目ぐらいの config.phpを呼んでいる部分を正しいPATHに設定します。
require_once('config.php');
5/32
document.doc 作成日時:2004/10/20
http://{ホスト名}/{index.phpへのパス}/index.phpにブラウザよりアクセスし、以下のメッセージが出れば成功です。
Please configure your Mojavi installation and remove this line from index.php
言われたとおりに index.phpの該当箇所(126行目ぐらい)を削除します。
*2.1 config.phpの他の定数に関しては、コメントを参考にしてください。
3、最初のアプリケーションとりあえず、最初のアプリケーションとして、HellowWorldと画面に表示するものを作成します。
3.1 HellwoWorldAction.class.phpの作成
webapp以下にmodules\Default\actionsというフォルダがあるので、そのフォルダの下にHellowWorldAction.class.phpを作成し、
以下のように編集します。
<?php
class HelloWorldAction extends Action {
function execute(&$controller, &$request, &$user) {
return VIEW_SUCCESS;
}
}
?>
6/32
document.doc 作成日時:2004/10/20
3.2 HellowWorldView_success.class.phpの作成
webapp以下にmodules\Default\viewsというフォルダがあるので、そのフォルダの下に HellowWorldView_success.class.php を作成し、以下のように
編集します。
<?php
class HelloWorldView extends view { //クラス名には_successをつけない
function execute(&$controller, &$request, &$user) {
$renderer = new Renderer(&$controller, &$request, &$user);
$renderer = setTemplate(‘HellowWorld.php’);
return VIEW_SUCCESS;
}
}
?>
3.2 HellowWorld.phpの作成
webapp以下にmodules\Default\templatesというフォルダがあるので、そのフォルダの下にHellowWorld.phpを作成し、以下のように編集します。
<h1>HellowWorld</h1>
上記3つのファイルが準備できたら、http://(ホスト名)/(index.phpへのパス)/index.php?module=Default&action=HellowWorld
にアクセスすると、ブラウザにHellowWorldと表示されます。
7/32
document.doc 作成日時:2004/10/20
4、Mojaviの仕組み4.1 controllerについて
index.phpのソースで、処理と呼べるものは 143行目ぐらいです。
$controller->dispatch();
この controller(lib/Controller.class.php)がリクエストパラメーターよりAction呼び出し、Actionの戻り値より viewの呼び出し
といった処理を担っています。
4.1.1 Actionの命名ルール
呼び出されるActionは、以下のルールで決定されます。
* パラメーターmoduleの値により、modules/{moduleの値}/actionsフォルダを検索します。
* パラメーター actionの値により、{actionの値}Action.class.phpを読み込みます。
* 読み込んだファイルの actionの値 Actionクラスを生成し、実行します。
4.2 Actionについて、
このクラスのメソッド executeが主な処理を実行し、次の画面を決める役割を担っています。
function execute(&$controller, &$request, &$user) {
return VIEW_SUCCESS;
}
Actionの戻り値が画面描画処理(View)を決定しています。
Actionには execute以外にも、入力チェック、認証、権限チェックなどのメソッドを備えています。(*4.1)
4.2.1 引数について(*4.2)
* $controllerは 4.1で説明したとおりです。このオブジェクトから、config.phpの設定、現在のモジュールなどの情報が取得可能です。
* $requestは名前のとおり、requestに関する情報で、メソッドがGETでも POSTでもこのパラメーターから値を取得できます。
また、viewに渡すための一時的なデータもここに保存できます。
* $userはユーザー(セッション)に関する情報です。このオブジェクトにユーザーの承認状態・権限を設定し、取得できます。
8/32
document.doc 作成日時:2004/10/20
また、session 中保存しておきたい情報もここに保存できます。
4.2.2 Viewの命名ルール
戻り値の定数VIEW_SUCCESSはmojavi-all-class.phpに定義されています。
define('VIEW_SUCCESS', 'success');
Action 終了後に呼び出される viewは、次のルールで決まります。
{moduleのフォルダ}/views/{actionの値}View_{actionの戻り値}.class.php
(Viewの中のクラス名には action 戻り値はつけません! 今回の場合 HellowWorldViewというクラスになります。)
*4.1 actionのその他メソッドについては後述します。(lib/Action.class.phpを参照)
*4.2 引数のメソッドについては後述します。
4.3 Viewについて、
Viewクラスは画面の表示を担っていますが、実際はテンプレートエンジンRendererを生成しているだけで、
Controllerが戻り値のRendererの executeを実行し、描画しています。
デフォルトのRendererは指定された template(php)に、引数を渡して実行するだけですが、
Rendererを継承することにより好きなテンプレートエンジンを組み込むことが可能です。
9/32
document.doc 作成日時:2004/10/20
opt/rendererのディレクトリには SmartyRendererと、SmartTemplatesRendererが用意されています。
Smarty/SmartTemplate に慣れている場合これを使うのが手っ取り早いでしょう。
SmartyRendererを使う場合
function & execute(&$controller, &$request, &$user) {
require_once(OPT_DIR. 'renderers/SmartyRenderer.php');
$renderer =& new SmartyRenderer();
$renderer->setTemplate('HellowWorld.html');
$renderer->setAttribte('name', $request->getAttribute('name'));
return $renderer;
}
10/32
document.doc 作成日時:2004/10/20
5、少し複雑なアプリケーション
上記のような
* ユーザー認証が要る
* ユーザー検索・登録(画面からの入力)が要る
* ユーザー一覧画面(動的な表示)が要る
アプリケーションを構築します。
今回、テンプレートはHTML_Template_Flexy(*5.2)を使います。
また、あくまでMojaviの説明が主なので、データベースは使いません。
*5.1 データベースが絡む部分(ユーザー検索・登録)は割愛しています。
*5.2 なるべくHTML_Template_Flexy 固有の機能は使わない予定です。
11/32
*5.1
document.doc 作成日時:2004/10/20
5.1 とりあえずメニュー画面
config.phpの 88行目に以下のような定義があります。
define('DEFAULT_MODULE', 'Default');
define('DEFAULT_ACTION', 'DefaultIndex');
これは、(上の行のコメントが示すように)index.phpにmodule名・Action名が指定されなかったときに呼ばれるmoduleとActionを指定しています。
という訳で、Defaultモジュールの下に、DefaultIndexアクションを作り、そこからユーザー検索画面を呼ぶようにします。
DefaultIndexAction.class.php(execteメソッド)
// メニュー画面を表示する
function execute(&$controller, &$request, &$user)
{
return VIEW_SUCCESS;
}
ただ単にHTMLを表示するだけのVIEWも用意します。
DefaultIndexView_success.class.php(execteメソッド)
function & execute(&$controller, &$request, &$user)
{
require_once(OPT_DIR.'/renderers/FlexyRenderer.class.php');
$renderer =& new FlexyRenderer();
$renderer->setTemplate('menue.html');
return $renderer;
}
12/32
document.doc 作成日時:2004/10/20
user_search.html
<body>
<center>
<h2>メニュー</h2>
<a href=’{index.phpへの PATH}?module=UserMaster&action=Search’>ユーザー検索</a>
<a href=’{index.phpへの PATH}?module=UserMaster&action=Add’>ユーザー登録</a>
</center>
</body>
これで index.phpにアクセスすると、メニュー画面が出ると思います。
しかし、この状態では誰でもアクセスできてしまうので、承認されていないユーザー以外は、アクセスできないようにします。
5.2 認証と、認証チェック
5.2.1 認証の必要な画面の作り方
DefaultIndexActionに以下のメソッドを追加します。
//このメソッドは親クラスの isSecureをオーバーライドしています。
function isSecure()
{
return TRUE;
}
13/32
document.doc 作成日時:2004/10/20
上記が終わったら再度 index.phpにアクセスすると、以下のエラーが出ます。
WARNING [C:\eclipse\workspace\mojavi\opt\auth\PrivilegeAuthorizationHandler.class.php:78]
Invalid configuration setting(s): AUTH_MODULE (Default) or AUTH_ACTION (Login)
PrivilegeAuthorizationHandlerは、actionオブジェクトの isSecureが TRUEを返す場合、userオブジェクトの状態
(isAuthenticated()の戻り値)をみて、承認されていなければ AUTH_MODULE・AUTH_ACTIONにフォワードします。
5.2.2 認証(ログイン)画面の作成
AUTH_MODULE・AUTH_ACTIONは config.phpの 75,76行目あたりで定義されていますが、AUTH_ACTIONは”Login”と設定されているようなので
LoginActionを作って認証画面にします。
LoginAction.php
function execute (&$controller, &$request, &$user)
{
if ($user->isAuthenticated()) //承認ずみならメニュー画面に
{
$controller->forward(DEFAULT_MODULE, DEFAULT_ACTION);
return VIEW_NONE;
}
//入力値を取得($_GET,$_POSTは使わない)
$username = $request->getParameter('name');
$password = $request->getParameter('password');
14/32
document.doc 作成日時:2004/10/20
//ログインできるユーザーの設定
$users = array('admin'=>'admin',’user’=’user’);
//admin=admin,user=userでログインできる。
if (array_key_exists($username, $users) && $users[$username] = $password )
{
//ユーザーを承認状態にして、メニュー画面に遷移
$user->setAuthenticated(TRUE);
$controller->forward(DEFAULT_MODULE, DEFAULT_ACTION);
return VIEW_NONE;
}
$request->setError('login', 'ユーザー名かパスワードに過りがあります!');
return VIEW_INPUT;
}
//POSTのときだけ実行する。
function getRequestMethods ()
{
return REQ_POST;
}
15/32
document.doc 作成日時:2004/10/20
5.2.3 ほかのActionへのフォワードの仕方
LoginActionの
$controller->forward(DEFAULT_MODULE, DEFAULT_ACTION);
return VIEW_NONE;
ですが、$contorller->forward(‘モジュール名’,’アクション名’);とすることにより、ほかのActionにフォワードすることが出来ます。
(ここではDefautlモジュールのDefaultIndexAction)
VIEW_NONEは(mojavi-all-class.phpで)NULLと定義されています。Actionの戻り値がNULLの場合はVIEWは呼び出されません。
5.2.4 ユーザーの承認状態の設定
$user->setAuthenticated(TRUE); //ユーザーを承認済み状態に
上記メソッドで TRUEを設定するとユーザーが承認済み、FALSEと設定すると、ユーザーが未承認に設定されます。
5.2.5 Action->getRequestMethods()とAction->getDefaultView()
また、メソッド getRequestMethods ()は、executeを実行するリクエストメソッドを決定します。
今回は画面からの入力があったときに検証を実行するので、REQ_POSTを返しています。
(親クラスでは、GET/POST 両方処理するように設定されています。)
function getRequestMethods ()
{
return REQ_POST | REQ_GET;
}
getRequestMethods ()で処理するメソッド以外でのリクエストの場合(今回はGET)は、
getDefaultViewメソッドで規定されているVIEWが返されます。
(親クラスでVIEW_INPUTと定義されているので、今回はオーバーライドしません。)
16/32
document.doc 作成日時:2004/10/20
LoginActionのVIEWとテンプレートは以下のようになります。
LoginView_success.class.php
function & execute(&$controller, &$request, &$user)
{
require_once(OPT_DIR.'/renderers/FlexyRenderer.class.php');
// create a new Renderer instance
$renderer =& new FlexyRenderer();
// set the template
$renderer->setTemplate('LoginInput.html');
//フォームパラメーター設定
$renderer -> setAttribute ('formAction', $_SERVER['PHP_SELF']);
$renderer -> setAttribute ('module', $controller->getCurrentModule());
$renderer -> setAttribute ('action', 'Login');
//エラーがあればメッセージ表示
$renderer->setAttribute('messages', $request->getErrors());
return $renderer;
}
17/32
document.doc 作成日時:2004/10/20
LoginInput.html
<body>
<center>
<h2>LOGIN</h2>
<form name='loginForm' method=’POST’action=’{formAction}’>
<input name='module' type='hidden' value=’{module}’/>
<input name='action' type='hidden' value=’{action}’/>
name:<input name='name' type='text'/><br>
password:<input name='password' type='password'/><br>
<input type='submit' value='送信'/>
</form>
{if:messages}
{foreach:messages,name,message}
<font color=red>{message}</font><br>
{end:}
{end:}
</center>
</body>
index.phpにアクセスして、ログイン画面が出るかどうか試してみてください。
また、admin/admin, user/userでログインできるか、それ以外のときにエラーが出るか試してみてください。
18/32
document.doc 作成日時:2004/10/20
ログインできると、しばらくログインしっぱなしになってしまうのでログアウト用のActionも作ります。
LogoutAction.class.php(モジュールはデフォルト)
function execute (&$controller, &$request, &$user)
{
$user->setAuthenticated(FALSE);
$controller->forward(DEFAULT_MODULE, DEFAULT_ACTION);
return VIEW_NONE;
}
上記にアクセスして、ログアウトされるか確認してみてください。
5.3 入力チェック(Validation)
ログイン画面では現在のところ入力チェックは何も行っていません。
それらしい画面にするために入力チェックロジックを LoginActionに組み込みます。
LoginActionで registerValidatorsと、handleErrorメソッドをオーバーライドします。
LoginAction.class.php
/*
* ユーザー名・パスワードが入力されていなかったらエラーメッセージ
*/
function registerValidators (&$validatorManager, &$controller, &$request, &$user)
{
$validatorManager->setRequired('name', TRUE, '名前は必須です!');
$validatorManager->setRequired('password', TRUE, 'パスワードは必須です!');
}
19/32
document.doc 作成日時:2004/10/20
/*
* エラーのときは入力画面を返す。
*/
function handleError(&$controller, &$request, &$user)
{
return VIEW_INPUT;
}
上記 2つのメソッドを追加したら、ログイン画面でパスワード、名前を入力せずにボタンを押してみてください。
エラーメッセージ(“名前は必須です!”、“パスワードは必須です!”)が表示されます。
5.3.1 registerValidators()と handleError
registerValidatorsメソッドは引数の ValidatorManagerに入力チェック条件を設定します。
設定されたチェック条件は、validatorManager->execute()を controllerが呼び出すことにより検査され、
エラーがある場合 actionの hadleErrorメソッドが呼び出されます。(*5.3.1)
また、Actionクラスには validateメソッドも用意されており(親クラスでは単に TRUEを返すメソッド)、
独自に入力値のチェックを追加することも可能です。(*5.3.2)
*5.3.1 getRequestMethodで返されるメソッドと違う場合、registerValidatorsも validateも呼ばれません。
*5.3.2 registerValidatorsと validateが両方定義されていた場合、両方実行されます。
20/32
document.doc 作成日時:2004/10/20
5.3.2 ValidatorManagerとValidator
ValidatorManagerは単独で、未入力チェック機能を持っています。
$validatorManager->setRequired('name', TRUE, '名前は必須です!');
第1引数は、チェックするパラメーター名です。
第 2引数に TRUEを設定すると未入力チェック(パラメーターが存在するか?パラメータの値の文字列長が 0以上か?)をチェックします。
第 3引数はエラーのときのエラーメッセージです。
ValidatorManagerは未入力チェックのみを行いますが、Validatorオブジェクトを追加することでより複雑なチェックが可能です。
名前は 3文字以上、パスワードは半角英数のみにしたい場合、次のように変更します。
/*
* ユーザー名とパスワードのチェック
*/
function registerValidators (&$validatorManager, &$controller, &$request, &$user)
{
require_once(OPT_DIR.'validators/StringValidator.class.php');
require_once(OPT_DIR.'validators/RegexValidator.class.php');
//nameの検証 3文字以上
$nameValidator = new StringValidator();
$nameValidator->setParameter('min', 3);
$nameValidator->setParameter('min_error', '名前が短かすぎます');
//検証オブジェクトを’name’に追加
$validatorManager->register('name', $nameValidator);
$validatorManager->setRequired('name', TRUE, '名前は必須です!');
21/32
document.doc 作成日時:2004/10/20
//パスワードは英数のみ
$passwordValidator = new RegexValidator();
$passwordValidator->setParameter('pattern', '/\w/' );
$passwordValidator->setParameter('pattern_error', 'パスワードは英数のみです!');
//検証オブジェクトを’password’に追加
$validatorManager->register('password', $passwordValidator);
$validatorManager->setRequired('password', TRUE, 'パスワードは必須です!');
}
上記修正が終わったら、正しくチェックできるか確認してください。
ValidationMnagerは未入力チェック以外の処理を Validatorオブジェクトに委譲しています。
$validatorManager->register(チェックするパラメーター名, Validator);
で、複雑な入力チェックを行えます。
opt/validatorsには、すでに実装済みのValidatorがいくつか用意されています。
もちろんValidatorを継承して、独自の検証ルールを設定することも出来ます。
22/32
document.doc 作成日時:2004/10/20
1つのパラメータに、複数のValidatorを設定することも可能です。
例:
//email欄に temptech.co.jp以外のメールアドレスが入力されていたらエラー
function registerValidators (&$validatorManager, &$controller, &$request, &$user)
{
require_once(OPT_DIR.'validators/RegexValidator.class.php');
require_once(OPT_DIR.'validators/EmailValidator.class.php');
//入力欄が emailかどうか
$emailValidator = new EmailValidator();
$emailValidator ->setParameter('email_error', 'メールアドレスの入力に誤りがあります。');
//temptech.co.jpのアドレスか?
$domainValidator = new RegesValidator();
$domainValidator ->setParameter('pattern', '/yahoo.co.jp/' );
$domainValidator ->setParameter('pattern_error', 'テンプスタッフのメールアドレスではありません!');
//検証オブジェクトを’email’に追加
$validatorManager ->register('email', $emailValidator);
$validatorManager->register('email', $domainValidator);
$validatorManager->setRequired('email', TRUE, 'メールアドレスは必須です!');
}
23/32
document.doc 作成日時:2004/10/20
5.4画面表示権限の設定とチェック
「ユーザー登録画面は特別な(管理者)ユーザーにしか表示したくない。」という要求があったとします。
このときに必要な、画面表示権限の設定・チェック方法を紹介します。
5.4.1 $user->addPrivilegeメソッドと、action-> getPrivlegeメソッド
Login時に、ユーザーへの権限設定を同時に行うことにします。
今回は”admin”でログインした人を管理者・”user”でログインした人を一般ユーザーと想定します。
LoginActionの executeに太字の行を追加してください。
LoginAction.php
function execute (&$controller, &$request, &$user)
{
if ($user->isAuthenticated()) //承認ずみならメニュー画面に
{
$controller->forward(DEFAULT_MODULE, DEFAULT_ACTION);
return VIEW_NONE;
}
//入力値を取得($_GET,$_POSTは使わない)
$username = $request->getParameter('name');
$password = $request->getParameter('password');
//ログインできるユーザーの設定
$users = array('admin'=>'admin',’user’=’user’);
24/32
document.doc 作成日時:2004/10/20
//admin=admin,user=userでログインできる。
if (array_key_exists($username, $users) && $users[$username] = $password )
{
//ユーザーを承認状態にして、メニュー画面に遷移
$user->setAuthenticated(TRUE);
$user->addPrivilege($username, 'useradd'); //とりあえず権限種別を’useradd’、権限=ユーザー名にする。
$controller->forward(DEFAULT_MODULE, DEFAULT_ACTION);
return VIEW_NONE;
}
$request->setError('login', 'ユーザー名かパスワードに過りがあります!');
return VIEW_INPUT;
}
これで権限の設定は終了です。
$user->addPrivilege('権限名', 'カテゴリー名');
上記メソッドでユーザーに権限を追加できます。
権限は、2つ目の引数でカテゴリごとに分類が可能です。(2つ目の引き数は省略可能)
カテゴリー名が違うものなら、複数の権限をユーザーに付与できます。
この後、管理者のみ表示可能な画面では、そのActionの getPrivlegeメソッドをオーバーライドすることにより
自動的に権限チェックを行ってくれます。
25/32
document.doc 作成日時:2004/10/20
function getPrivilege (&$controller, &$request, &$user)
{
return array('admin', 'useradd'); //この画面を表示できる権限・カテゴリーを返す。
}
getPrivilegeで返却された権限を設定されていないユーザーは、
config.phpの SECURE_MODULE、SECURE_ACTIONに設定されたActionとModuleに移動させられます。
5.5 フィルターとフィルターリスト
すべての処理の前・後に必ず行いたい処理(エンコーディング・ログ出力・etc)を作成するには Filterと FilterListが有効です。
Filterを継承して、Actionの executeの前処理・Viewの executeの後処理を記述することが出来ます。
FilterListを継承して複数の Filterを設定することにより、filterを数珠繋ぎに実行することができます。
今回は処理終了後にファイルにログを出力する Filterを作成します。
BASE_DIRで設定されているディレクトリの下に filtersフォルダをつくります。
その下に LogFilter.class.phpを作成してください。
LogFilter.class.php
/*
* Filterのサンプルです。
* PEAR::LOGを使いログ出力をしています。
* ログ出力の機能は Mojaviにも用意されています。
*/
26/32
document.doc 作成日時:2004/10/20
class LogFilter extends Filter{
var $logger = null;
/*
* 初期化処理・ログオブジェクトを初期化しています。
*/
function initialize ($params)
{
//Actionや Viewでもログ出力をするのであれば、index.phpで初期化処理をしたほうが良い。
require_once('Log.php');
parent::initialize($params);
$this->logger = &Log::factory('file', BASE_DIR . '/logs/out.log', 'ALL');
}
// Action実行後にログ出力をしています。
function execute (&$filterChain, &$controller, &$request, &$user)
{
// 前処理
if($this->logger == null ) {
$this->initialize(array('moduleDir'=>$controller->getModuleDir()));
}
// 次の Filter実行
$filterChain->execute($controller, $request, $user);
27/32
document.doc 作成日時:2004/10/20
// 後処理
$this->logger->log('終了');
}
}
その後 BASE_DIRディレクトリのGlobalFilterList.class.phpを修正します。
class GlobalFilterList extends FilterList{
function registerFilters (&$filterChain, &$controller, &$request, &$user)
{
//先ほど作成した Filterを追加する。
require_once('filters/LogFilter.class.php' );
$filterChain->register(new LogFilter());
}
}
これで、BASE_DIR/logsにログファイルが出力されます。
FilterList/FilterはModule ごとにも作成できます。
その際は、Moduleのディレクトリに{モジュール名}FilterList.class.phpを作成し、{モジュール名}FilterListを作成します。
追加する Fiterは、Moduleのディレクトリ/Filtersに作成します。
28/32
document.doc 作成日時:2004/10/20
6、Mojaviのその他の機能(index.phpを使用) index.phpでその他の共通処理がカスタマイズ可能です。
6.1 セッション管理
セッション管理は、SessionHandler(OPT_DIR/session/SessionHandler.class.php)が担っていますが、
このクラスを継承して、DBでセッション管理をすることも可能です。
MySQLSessionHandlerと、PostgreSQLSessionHandlerがすでに用意されています。
6. 2 ユーザーコンテナ
$userオブジェクトは、$containerオブジェクト(OPT_DIR/use/Container.class.php)により管理されています。
デフォルトでは SessionContainer(OPT_DIR/use/SessionContainer.class.php)により$_SESSIONを使って管理されていますが、
Containerクラスを継承してカスタマイズすることが可能です。
6.3 ログ機能
Mojaviにはログ出力用のクラスがすでに用意されています。
これらの機能はほぼ Log4j と同じです。(*6.3.1)
ただ、若干使い勝手が悪いので、適当な Loggerクラスを継承するか、ほかの Logライブラリ(*6.3.2)
を検討しても良いかもしれません。
*6.3.1 詳細は、OPT_DIR/loggingにある各クラス、および inde.phpを参考にしてください。
*6.3.2 PEAR::LOG・Log4php などがあります。
29/32
document.doc 作成日時:2004/10/20
7、 config.phpの設定7.1 BASE_DIR
ここで設定したディレクトリ以下にmodles/各モジュールなどを配置します。
7.2 LOG_DIR
ログ出力する際の基本ディレクトリです。デフォルトではとくにログ出力は行わないので、重要な設定ではありません。
7.3 MOJAVI_FILE
mojavi-all-class.phpを指定してください。このファイルで中核となるクラスのデフォルトの実装が提供されています。
7.4 OPT_DIR
optディレクトリを指定してください。OptディレクトリにはRenderer や、Validatorの実装のバリエーションが提供されています。
7.5 WEB_MODULE_DIR
CSS やイメージファイルの格納先を示しますが、mojavi 内部でこの定数が使われることが無いので重要ではありません。
7.6 SCRIPT_PATH
index.phpへのパスを指定して下さい。
7.7 MODULE_ACCESSOR
ここで定義された定数が、module名を表わすクエリー変数名になります。
7.8 ACTION_ACCESSOR
ここで定義された定数が、action名を表わすクエリー変数名になります。
7.9 AUTH_MODULE/AUTH_ACTION
認証が必要なActionを認証されていないユーザーが実行したときに forwardされるModule/Actionです。
7.10 DEFAULT_MODULE/DEFAULT_ACTION
Module/Actionがクエリー変数に無かったときに実行されるModule/Actionです。
7.11 ERROR_404_MODULE/ERROR_404_ACTION
Module/Actionに指定されたModule/Actionが見つからなかったときに実行されるModule/Actionです。
7.12 SECURE_MODULE/ SECURE_ACTION
Actionが指定する権限をユーザーが持っていない場合に forwardされるModule/Actionです。
30/32
document.doc 作成日時:2004/10/20
7.13 UNAVAILABLE_MODULE/ UNAVAILABLE_ACTION
定数AVAILABLEが FALSEのときに実行されるModule/Actionです。
7.14 AVAILABLE
この定数が FALSEの時にはすべてUNAVAILABLE_MODULE/ UNAVAILABLE_ACTIONに forwardされます。
7.15 DISPLAY_ERRORS
この定数に 1を設定すると、出力にエラー情報を表示します。0の場合出力にエラー情報を表示しません。
7.16 PATH_INFO_ARRAY/ PATH_INFO_KEY
PATH_INFO_ARRAYに 1を設定すると$_SERVERに 2を設定すると$_ENVに PATH 情報を格納します。
PATH_INFO_KEYは PATH 情報を取得するための Key名称です。
7.17 URL_FORMAT
この変数に 1を設定すると http://{サーバー名}/{index.phpへの PATH}?module={モジュール名}&action={アクション名}でアクセスできます。
2を設定すると http://{サーバー名}/{index.phpへの PATH}/module/{モジュール名}/action/{アクション名} というURL形式に変わります。
7.18 USE_SESSIONS
セッションを使うかどうかの設定です。
31/32
document.doc 作成日時:2004/10/20
参考資料
書籍: 「まるごとPHP!Vol.1」 インプレス発行 ISBN-8443-2025-4
URL : MojaviProject http://www.mojavi.org/
Tutorila: Mojavi for Beginners http://www.peterrobins.co.uk/it/mojavi/tutorial.htm
Tutorial Index http://wiki.mojavi.org/Mojavi20/TutorialIndex
32/32