フレームワークの最もよいところは、どう動作しているかわからなくても使えるところです。この考え方は特に「どう動くか」を詳しく掘り下げていくのが好きなPHP 開発者にはいやがられます。しかし重要なのは、クラスが何をしているのか、どう使うのかを理解することです。
リスト10は、Loginモジュールがどのようなものかを示しています。EdLecky-Thompsonが書いたセッションハンドラを使用していることに注意してください。
リスト10
<?php
⁄**
*
*
*
* @author Darryl Patterson <darryl.patterson@eurorscg.com>
* @copyright Euro RSCG 4D
*
*⁄
class Module_Login extends Module {
function Module_Login()
{
parent::Module('Login');
$this->defaultAction = 'login';
}
function getHandledRequest()
{
$html = '';
switch (HTTPRequest::getAction()){
case 'process':
$html = $this->login_process();
break;
case 'logout':
$html = $this->logout();
break;
default:
$html = $this->login();
}
return $this->getTemplate();
}
function login_process()
{
if ($this->env->session->login(
HTTPRequest::getParameter('username',),
HTTPRequest::getParameter('password'))){
HTTPRequest::redirect(
$this->env->session->getValue(
'loginRedirect'));
return;
} else {
$this->loadTemplate('loginError');
}
}
function login()
{
}
function logout()
{
$this->env->session->logout();
$this->env->session->setValue('loginRedirect', '');
HTTPRequest::redirect('Default');
}
}
?>
リスト11は、Login アクション用のアクションテンプレートを示しています。単純なHTML ドキュメントの一部です。ディレクトリツリー内では次の場所になります。/include/tpl/Login/login.tpl
リスト11
<form action="/app/Login/process" method="post">
<table border="0">
<tr>
<td>{LANG_username}:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>{LANG_password}:</td>
<td><input type="text" name="password" /></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" value="{LANG_submit}" /></td>
</tr>
</table>
</form
リスト12には言語ファイルが示してあります。ディレクトリツリーでは次の場所になります。/include/lang/Login/en.txt
リスト12
username = Username
password = Password
submit = Login
このサンプルモジュールで最も重要なのは、getHandledRequest()関数をどうやってオーバーライドしているかというところです。Moduleスーパークラス(リスト6)を見ると、getHandledRequest()関数はただ定義されているだけ(ブロック内にコードがない)であることがわかるでしょう。
PHP5ならこの関数は抽象関数となり、必ずモジュール内で実装するよう開発者に強制することができます。開発者が作るのは、モジュールのアクションの処理だけです。実装には様々な方法がありますが、ここでのコード標準ではswitch/case文を使うことになっています。
アクションをチェックし、アクションとして普通は同じ名前の関数を呼び出します。Webブラウザが/app/Login/login にリクエストを送ってきた時は、フレームワークはLoginモジュールを読み込み、さらにその中でlogin.tpl という名前のテンプレートが読み込まれます。それからモジュールはlogin()関数を呼び出しますが、それは何もしません。モジュールのgetHandledRequest()関数が最終行でテンプレートをHTMLの一部として返し、それをハンドラが受け取ります。
Webブラウザがログインフォームをサブミットすると、リクエストはユーザ名とパスワードをPOSTデータとして持つ/app/Login/processとなります。この場合、フレームワークは再度Loginモジュールを読み込みますが、今度はprocess.tplというアクションテンプレートを読み込みます。見つからなければ何も読み込まれません。
次にモジュールはlogin_process()メソッドを呼び出し、ログイン処理を行います。ログインに成功すると、ホームページにリダイレクトされます。失敗すると、loginError.tplファイルがアクションテンプレートとしてモジュール内で読み込まれます。
これが全サイクルです。Loginクラスからわかるように、モジュールを作るのに特に制限はなく、モジュール1つだけで完結しています。
HTMLの変更はモジュールのアクションテンプレートで行われ、言語ラベルはモジュールごとの言語ファイルで処理されます。フレームワークを使うとアプリケーションのデバッグが簡単になります。URLによってエラーがどこで起きているか正確にわかるので、アクションをたどっていくことができます。テキストが間違っている場合も、修正しなくてはいけない部分が簡単に分かります。
HTMLに間違いがあれば、tplディレクトリを見ればいいのです。フレームワークではすべてがとても明確になります。
|