例 -- Event_Dispatcher の使用例
Event_Dispatcher の使用例
以下の例は、より柔軟性に富むアプリケーションを構築するために
Event_Dispatcher をどの様に使用するかを例示しています。
例 42-1基本的な例 require_once 'Event/Dispatcher.php';
/**
* 認証をシミュレートするためのダミークラス
*/
class Auth
{
var $_dispatcher = null;
var $_user;
function Auth(&$dispatcher)
{
$this->_dispatcher = &$dispatcher;
}
function login($username, $password)
{
// 認証を行うコードをここに記述する
// ....
// $this->_user は User オブジェクトを含んでいるとする
$this->_dispatcher->post($this->_user, 'onLogin');
}
}
function logAuth(&$notification)
{
$user = &$notification->getNotificationObject();
$username = $user->getUsername();
// ログファイルに書き込む
error_log("$username logged in.", 3, '/tmp/auth.log');
}
$dispatcher = &Event_Dispatcher::getInstance();
// ログファイルに書き込むために全ての onLogin イベントをキャッチする
$dispatcher->addObserver('logAuth', 'onLogin');
$auth = &new Auth($dispatcher);
// ログインをシミュレート
$auth->login($_GET['user'], $_GET['pass']); |
この例では、Event_Dispatcher は認証プロセスで
オブザーバをフックするために使用されています。
ユーザーが認証された場合は常に onLogin
が通知されます。
これはログファイルを書き込んだり、
他のユーザーからアプリケーションを保護するために使用する事が可能です。
|
例 42-2通知のキャンセル require_once 'Event/Dispatcher.php';
/**
* 認証をシミュレートするためのダミークラス
*/
class Auth
{
var $_dispatcher = null;
var $_user;
function Auth(&$dispatcher)
{
$this->_dispatcher = &$dispatcher;
}
function login($username, $password)
{
// 認証を行うコードをここに記述する
// ....
// $this->_user は User オブジェクトを含んでいるとする
$notification = $this->_dispatcher->post($this->_user, 'onLogin');
if ($notification->isNotificationCancelled()) {
echo "You are not allowed to login";
$this->_user->logout();
}
}
}
function logAuth(&$notification)
{
$user = &$notification->getNotificationObject();
$username = $user->getUsername();
// もし特別なユーザーが認証された場合、
// 通知をキャンセルする
if ($username === 'foo') {
$notification->cancelNotification();
} else {
// ログファイルに書き込む
error_log("$username logged in.", 3, '/tmp/auth.log');
}
}
$dispatcher = &Event_Dispatcher::getInstance();
// ログファイルに書き込むために全ての onLogin イベントをキャッチする
$dispatcher->addObserver('logAuth', 'onLogin');
$auth = &new Auth($dispatcher);
// ログインをシミュレート
$auth->login($_GET['user'], $_GET['pass']); |
この場合、cancelNotification()
メソッドは特定のユーザーが認証を行おうとした場合に
通知をキャンセルするために使用されています。
login メソッドは通知がキャンセルされたかどうかをチェックし、
必要な手順を行うよううまく修正されています。
これにより、
独自の認証システムで柔軟性に富んだルールを追加することができます。
|