以下の例は、より柔軟性に富むアプリケーションを構築するために Event_Dispatcher をどの様に使用するかを例示しています。
基本的な例
<?php
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 が通知されます。
これはログファイルを書き込んだり、 他のユーザーからアプリケーションを保護するために使用する事が可能です。
通知のキャンセル
<?php
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 メソッドは通知がキャンセルされたかどうかをチェックし、 必要な手順を行うよううまく修正されています。
これにより、 独自の認証システムで柔軟性に富んだルールを追加することができます。