例 -- Event_Dispatcher の使用例

Event_Dispatcher の使用例

以下の例は、より柔軟性に富むアプリケーションを構築するために Event_Dispatcher をどの様に使用するかを例示しています。

例 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 メソッドは通知がキャンセルされたかどうかをチェックし、 必要な手順を行うよううまく修正されています。

これにより、 独自の認証システムで柔軟性に富んだルールを追加することができます。