События в Yii

На днях решил освоить события в Yii. После мозгового штурма с знакомым, родилась некая схема работы.
Рассмотрим на примере, после успешной авторизации пользователя необходимо обновить поле даты последнего посещения(User->last_visit).
Для этого в класс идентификации необходимо объявить событие onAuthenticate:
PUserIdentity.php

    public function onAuthenticate(CEvent $event) {
        $this->raiseEvent('onAuthenticate', $event);
    }

Затем после успешной аутентификации пользователя необходимо вызвать событие:
PUserIdentity.php

    /**
     * Аутентификация пользователя
     * @return int
     */
    public function authenticate() {
        $user = User::model()->find('LOWER(email) = ?', array(strtolower($this->email)));

        if($user === null) {
            $this->errorCode = self::ERROR_EMAIL_INVALID;
        } else if(PPassword::encrypt($this->password, $user->salt) !== $user->password) {
            $this->errorCode = self::ERROR_PASSWORD_INVALID;
        } else {
            $this->_id = $user->id;
            $this->username = $user->username;
            $this->errorCode = self::ERROR_NONE;
            // вызываем событие
            $this->onAuthenticate(new CEvent($user));
        }

        return !$this->errorCode;
    }

Теперь самое интересное, все обработчики централизовано хранятся в массивеconfig/handlers.php:


return array(
    'onAuthenticate'=>array(
        array('User', 'updateLastVisit'),
    ),
);

Метод updateLastVisit в модели User в качестве параметра должен принимать экземпляр класса CEvent. Описание данного метода я не стану приводит.
Для того чтобы зарегистрировать обработчики событий в классе, напишем статический метод, который будет это делать и вызывать его при инициализации класса. У меня он расположен в хелпере.

    /**
     * Навещивает обработчики событий
     * @static
     * @param CComponent $object
     * @return object
     */
    public static function attacheHandlers(CComponent &$object) {
        $config = PConfig::getEventsConfig();
        foreach($config as $event=>$handlers) {
            if(!method_exists(get_class($object), $event))
                continue;

            foreach($handlers as $handler)
                $object->$event = $handler;
        }
    }

Теперь в нужном классе его нужно вызвать при инициализации:
PUserIdentity.php

    public function __construct($email, $password) {
        $this->email = $email;
        $this->password = $password;
        // PUtils хелпер где распологается метод
        PUtils::attacheHandlers($this);
    }