You are on page 1of 34

5773.

doc                                                 作成日時:2004/12/03 0:00:00

Mojavi マニュアル

1/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

1、 Mojavi とは? 6

2、 Mojavi の初 期設定 7

2,1 Mojavi のインストール 7

2,2 Mojavi の設定 7

3、 最初の アプリ ケーシ ョン 8

3.1 HellwoWorldAction.class.php の作成 8

3.2 HellowWorldView_success.class.php の作成 8

3.2 HellowWorld.php の作成 9

4、 Moj avi の仕組 み 9

4.1 controller について 9
4.1.1 Action の命名ルール 10

4.2 Action について、 10
4.2.1 引数について(*4.2) 10
4.2.2 View の命名ルール 10

2/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

4.3 View について、 11

5、 少し複 雑なア プリケ ーショ ン 13

5.1 とりあえずメニュー画面 14

5.2 認証と、認証チェック 15
5.2.1 認証の必要な画面の作り方 15
5.2.2 認証(ログイン)画面の作成 16
5.2.3 ほかの Action へのフォワードの仕方 18
5.2.4 ユーザーの承認状態の設定 18
5.2.5 Action->getRequestMethods()と Action->getDefaultView() 18

5.3 入力チェック(Validation) 21
5.3.1 registerValidators()と handleError 22
5.3.2 ValidatorManager と Validator 23

5.4 画面表示権限の設定とチェック 26
5.4.1 $user->addPrivilege メソッドと、action-> getPrivlege メソッド 26

5.5 フィルターとフィルターリスト 28

6、 Mojavi のそ の他の 機能( index.php を使 用) 31

6.1 セッション管理 31

3/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

6. 2 ユーザーコンテナ 31

6.3 ログ機能 31

7、 config.php の設 定 32

7.1 BASE_DIR 32

7.2 LOG_DIR 32

7.3 MOJAVI_FILE 32

7.4 OPT_DIR 32

7.5 WEB_MODULE_DIR 32

7.6 SCRIPT_PATH 32

7.7 MODULE_ACCESSOR 32

7.8 ACTION_ACCESSOR 32

7.9 AUTH_MODULE/AUTH_ACTION 32

7.10 DEFAULT_MODULE/DEFAULT_ACTION 32

4/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

7.11 ERROR_404_MODULE/ERROR_404_ACTION 32

7.12 SECURE_MODULE/ SECURE_ACTION 32

7.13 UNAVAILABLE_MODULE/ UNAVAILABLE_ACTION 33

7.14 AVAILABLE 33

7.15 DISPLAY_ERRORS 33

7.16 PATH_INFO_ARRAY/ PATH_INFO_KEY 33

7.17 URL_FORMAT 33

7.18 USE_SESSIONS 33

5/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

1、Mojavi とは?
Mojavi(*1.1)とは、Mojavi Project で開発されている。オープンソース(*2.1)のフレームワークです。
MVCモデルを基本としていますが、多くのモジュールに Struts などの Apache/Jakarta の影響が見受けられます。
 特徴としては
* モジュールによる管理構造
* (チェーンに出来る)フィルタ機能
* ほとんどのライブラリが拡張可能(ユーザーコンテナ・バリデーション・認証/承認機能・描画機能・ログ機能)
* リクエストパラメーターと、ネーミングルールによるシンプルな画面遷移。
 
  シンプルなMVCモデルですが、セッション機能・リクエストの処理・認証などが、デフォルトで組み込まれているので
 PHPの初心者でも習得が容易なフレームワークです。
  
  この資料では Mojavi を使って WebApplication を開発する方法をチュートリアル形式で紹介します。

 *1.1 「モハビ」と読む
 *2.1 ライセンスはLGPL

6/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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');

 

7/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

ht tp: //{ ホスト 名}/ {in dex .ph p への パス }/i nde x.p hp にブ ラウザ よりア クセス し、以 下のメ ッセー ジが出 れば成 功です 。
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;
}
}
?>

3.2 HellowWorldView_success.class.php の作成
 webapp 以下に modules\Default\views というフォルダがあるので、そのフォルダの下に HellowWorldView_success.class.php を作成し、以下のように編集し

8/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

ます。
<?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?mod ule= Defa ult& acti on=H ello wWor ld
にアクセスすると、ブラウザに HellowWorld と表示されます。

4、Mojaviの仕組み
4.1 controller について
index.php のソースで、処理と呼べるものは 143 行目ぐらいです。
$controller->dispatch();

9/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

この 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 はユーザー(セッション)に関する情報です。このオブジェクトにユーザーの承認状態・権限を設定し、取得できます。
また、session 中保存しておきたい情報もここに保存できます。

4.2.2 View の命名ルール
戻り値の定数 VIEW_SUCCESS は mojavi-all-class.php に定義されています。

10/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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 を継承することにより好きなテンプレートエンジンを組み込むことが可能です。

Renderer
View
-template
-attributes
+execute()

SmartyRenderer SmartTemplatesRenderer

 opt/renderer のディレクトリには SmartyRenderer と、SmartTemplatesRenderer が用意されています。
Smarty/SmartTemplate に慣れている場合これを使うのが手っ取り早いでしょう。

11/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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;
}

12/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

5、少し複雑なアプリケーション
取消 取消

取消
ユーザ情報 取消 登録
ログイン ログイン メニュー ユーザ情報管理 新規
検索

検索
ユーザ情報 確認
ユーザ情報
登録 登録確認

ユーザ情報 新規
検索一覧

一覧画面へ戻る

*5.1
メニュー画面へ戻る、ログアウトについては割愛

上記のような
* ユーザー認証が要る
* ユーザー検索・登録(画面からの入力)が要る
* ユーザー一覧画面(動的な表示)が要る
アプリケーションを構築します。

今回、テンプレートは HTML_Template_Flexy(*5.2)を使います。
また、あくまで Mojavi の説明が主なので、データベースは使いません。
 

*5.1 データベースが絡む部分(ユーザー検索・登録)は割愛しています。
*5.2 なるべく HTML_Template_Flexy 固有の機能は使わない予定です。

13/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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;
}

14/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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;
}

15/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

上記が終わったら再度 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');

16/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

//ログインできるユーザーの設定
$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;
}

17/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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 と定義されているので、今回はオーバーライドしません。)

18/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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;
}

19/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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 でログインできるか、それ以外のときにエラーが出るか試してみてください。

20/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

 ログインできると、しばらくログインしっぱなしになってしまうのでログアウト用の 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, 'パスワードは必須です!');
}

21/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

/*
* エラーのときは入力画面を返す。
*/
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 が両方定義されていた場合、両方実行されます。

22/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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, '名前は必須です!');

23/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

//パスワードは英数のみ
$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);

で、複雑な入力チェックを行えます。

Validator
ValidatorManager
- parameter
-
+execute()

Emailvalidator StringValidator NumberValidator RegexValidator

 opt/validators には、すでに実装済みの Validator がいくつか用意されています。
もちろん Validator を継承して、独自の検証ルールを設定することも出来ます。

24/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

 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, 'メールアドレスは必須です!');
}

25/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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’);

26/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

//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 メソッドをオーバーライドすることにより
自動的に権限チェックを行ってくれます。

27/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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 にも用意されています。
*/

28/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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);

29/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

// 後処理
$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 に作成します。

30/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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 などがあります。

31/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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 です。

32/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

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
セッションを使うかどうかの設定です。

33/34
5773.doc                                                 作成日時:2004/12/03 0:00:00

参考資料
 書籍: 「まるごと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

34/34