PEAR Manual
Prev |  | Next

# Examples

Examples -- Examples for the usage of Event_Dispatcher

## Examples usage of Event_Dispatcher

The following examples show you how to use Event_Dispatcher to create more flexible applications.

Example 36-1. Basic example
    require_once 'Event/Dispatcher.php';

    /**
     * Dummy class that simulated authentication
     */
    class Auth
    {
        var $_dispatcher = null;
        var $_user;

        function Auth(&$dispatcher)
        {
             $this->_dispatcher = &$dispatcher;
        }

        function login($username, $password)
        {
            // Your code that authenticates goes here
            // ....
            // imagine $this->_user contains a User object

            $this->_dispatcher->post($this->_user, 'onLogin');
        }
    }

    function logAuth(&$notification)
    {
        $user = &$notification->getNotificationObject();
        $username = $user->getUsername();

        // write logfile
        error_log("$username logged in.", 3, '/tmp/auth.log');
    }

    $dispatcher = &Event_Dispatcher::getInstance();

    // catch all onLogin events to write a logfile
    $dispatcher->addObserver('logAuth', 'onLogin');

    $auth = &new Auth($dispatcher);

    // simulate login
    $auth->login($_GET['user'], $_GET['pass']);
In this example, Event_Dispatcher is used to allow observers to hook into the authentication process. Whenever a user authenticates, a notification onLogin is sent. This can be used to write logfiles or block the application for other users.

Example 36-2. Cancelling notifications
    require_once 'Event/Dispatcher.php';

    /**
     * Dummy class that simulated authentication
     */
    class Auth
    {
        var $_dispatcher = null;
        var $_user;

        function Auth(&$dispatcher)
        {
             $this->_dispatcher = &$dispatcher;
        }

        function login($username, $password)
        {
            // Your code that authenticates goes here
            // ....
            // imagine $this->_user contains a User object

            $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 a special user authenticated, cancel
        // the notification
        if ($username === 'foo') {
            $notification->cancelNotification();
        } else {
            // write logfile
            error_log("$username logged in.", 3, '/tmp/auth.log');
        }
    }

    $dispatcher = &Event_Dispatcher::getInstance();

    // catch all onLogin events to write a logfile
    $dispatcher->addObserver('logAuth', 'onLogin');

    $auth = &new Auth($dispatcher);

    // simulate login
    $auth->login($_GET['user'], $_GET['pass']);
In this case, the cancelNotification() method is used to cancel the notification if a certain user tries to authenticate. The login method has been changed as well to check whether the notification has been cancelled and to take the necessary steps. This allows you to add some flexible rules to your authentication system.

Prev | Home | Next
Introduction | Up | Event_Dispatcher::getInstance()