Перейти к основному контенту

Работа с событиями в Юпи!

Начиная с версии 0.7 в состав Юпи! входит компонент, предназначенный для работы с событиями - EventManager. Реализация EventManager в Юпи! основана на компоненте EventDispatcher от Symfony. Подробнее про этот компонент можно узнать из официальной документации.

Если модуль и его компоненты содержит события, достуные для "подписки" другими компонентами, такой модуль должен содержать PHP-класс, описывающий все события. Рассмотрим это на примере модуля "Пользователи" (user). Внутри модуля имеется каталог events, а в нем класс UserEvents, вот с таким содержанием:


class UserEvents
{
    const SUCCESS_ACTIVATE_ACCOUNT = 'user.success.activate';

    const FAILURE_ACTIVATE_ACCOUNT = 'user.failure.activate';

    const SUCCESS_EMAIL_CONFIRM = 'user.success.email.confirm';

    const FAILURE_EMAIL_CONFIRM = 'user.failure.email.confirm';

    const SUCCESS_LOGIN = 'user.success.login';

    const FAILURE_LOGIN = 'user.failure.login';

    const BEFORE_LOGIN = 'user.before.login';

    const BEFORE_LOGOUT = 'user.before.logout';

    const AFTER_LOGOUT = 'user.after.logout';

    const BEFORE_PASSWORD_RECOVERY = 'user.before.password.recovery';

    const SUCCESS_PASSWORD_RECOVERY = 'user.success.password.recovery';

    const FAILURE_PASSWORD_RECOVERY = 'user.failure.password.recovery';

    const SUCCESS_ACTIVATE_PASSWORD = 'user.success.activate.password';

    const FAILURE_ACTIVATE_PASSWORD = 'user.failure.activate.password';

    const SUCCESS_REGISTRATION = 'user.success.registration';

    const FAILURE_REGISTRATION = 'user.failure.registration';
}

Каждая константа описывает одно событие. Название события ОБЯЗАТЕЛЬНО содержит в себе название модуля, к компоненту которого это событие относится. Остальные слова и фразы внутри названия события разделяются символом "."

Создание класса события

Вызов события

Для вызова события из кода компонента необходимо обратиться в компоненту EventManager и вызвать его метод "fire".


Yii::app()->eventManager->fire(UserEvents::SUCCESS_REGISTRATION, new UserRegistrationEvent());

Назначение обработчиков


 array(
        'class' => 'application.modules.rbac.RbacModule'
    ),
    'import' => array(
        'application.modules.rbac.listeners.AccessControlListener'
    ),
    'component' => array(
        'authManager' => array(
            'class' => 'CDbAuthManager',
            'connectionID' => 'db',
            'assignmentTable' => '{{user_user_auth_assignment}}',
            'itemChildTable' => '{{user_user_auth_item_child}}',
            'itemTable' => '{{user_user_auth_item}}',
        ),
        // override core ModuleManager
        'moduleManager' => array(
            'class' => 'application.modules.rbac.components.ModuleManager'
        ),
        //attach event handlers
        'eventManager' => array(
            'class' => 'yupe\components\EventManager',
            'events'=> array(
                // before backend controllers
                'yupe.before.backend.controller.action' => array(
                    array('AccessControlListener', 'onBeforeBackendControllerAction')
                )
            )
        )
    ),
    'rules' => array(
        '/backend/rbac///' => 'rbac/Backend/',
    ),
);

Если у вас есть вопросы или необходима помощь - задайте в чате - Yupe Team!