2015-02-18 3 views
27

Я прошел через документацию и все статьи на Yii2 events, найденные с помощью Google. Может ли кто-нибудь предоставить мне хороший пример того, как события могут использоваться в Yii2 и где это может показаться логичным?Как использовать события в yii2?

+0

Может быть, этот пример поможет вам - http://stackoverflow.com/questions/25847013/yii2-multiple-event-attach-on-view –

ответ

66

Я могу объяснить события на простом примере. Предположим, вы хотите сделать несколько вещей, когда пользователь сначала регистрируется на сайте, например:

  1. Отправить электронное письмо администратору.
  2. Создайте уведомление.
  3. вы называете это.

Вы можете попытаться вызвать несколько методов после успешного сохранения объекта пользователя. Может быть так:

if($model->save()){ 
    $mailObj->sendNewUserMail($model); 
    $notification->setNotification($model); 
} 

До сих пор это может показаться прекрасным, но что, если количество требований возрастает со временем? Скажем, 10 вещей должны произойти после регистрации пользователем пользователя? События приходят в такие ситуации.

Основы событий

События состоят из следующего цикла.

  1. Вы определяете событие. Скажем, новая регистрация пользователя.
  2. Вы называете это в своей модели. Может быть добавлено постоянное значение в модели User. Мне нравится const EVENT_NEW_USER='new_user';. Это используется для добавления обработчиков и для запуска события.
  3. Вы определяете метод, который должен что-то делать, когда происходит событие. Отправка сообщения электронной почты администратору. Он должен иметь параметр $event. Мы называем этот метод обработчиком.
  4. Вы прикрепляете этот обработчик к model, используя его метод, называемый on(). Вы можете вызывать этот метод много раз, вы хотите - просто вы можете подключить более одного обработчика к одному событию.
  5. Вы запускаете событие, используя trigger().

Обратите внимание, что все упомянутые выше методы являются частью класса Component. Почти все классы в yii2 унаследованы от этого класса. Да ActiveRecord тоже.

Давайте код

Для решения выше указанной проблемы мы можем иметь User.php модель. Я не буду писать весь код здесь.

// in User.php i've declared constant that stores event name 
const EVENT_NEW_USER = 'new-user'; 

// say, whenever new user registers, below method will send an email. 
public function sendMail($event){ 
    echo 'mail sent to admin'; 
    // you code 
} 

// one more hanlder. 

public function notification($event){ 
    echo 'notification created'; 
} 

Следует помнить, что вы не обязаны создавать методы в классе, который создает событие. Вы можете добавить любой статический, не статический метод из любого класса.

Мне нужно прикрепить вышеуказанные обработчики к событию. Основной способ, который я сделал, - использовать метод AR init(). Итак, вот так:

// this should be inside User.php class. 
public function init(){ 

    $this->on(self::EVENT_NEW_USER, [$this, 'sendMail']); 
    $this->on(self::EVENT_NEW_USER, [$this, 'notification']); 

    // first parameter is the name of the event and second is the handler. 
    // For handlers I use methods sendMail and notification 
    // from $this class. 
} 

Последняя задача - вызвать событие.Теперь вам не нужно явно вызывать все необходимые методы, как мы это делали раньше. Вы можете заменить его следующим:

if($model->save()){ 
    $model->trigger(User::EVENT_NEW_USER); 
} 

Все обработчики будут автоматически вызваны.

+1

Очень хороший и тщательный пример там, мне очень помог. Могу ли я использовать этот тип реализации для wordpress, например, для разработки плагинов? Если это так, вы можете проиллюстрировать, как показано выше. –

+2

@nirajanpoudel извините, я не парень Wordpress. –

+1

Это очень помогло. если я хочу подключиться к глобальному $ app, где я определяю обработчики событий, как в вашем ответе, вы определили его в init() модели пользователя? – user1502826

20

Для "глобальных" событий.

При желании вы можете создать специализированный класс событий

namespace your\handler\Event\Namespace; 
class EventUser extends Event { 
    const EVENT_NEW_USER = 'new-user'; 
} 

определить по крайней мере один класс обработчика:

namespace your\handler\Event\Namespace; 
class handlerClass{ 
    // public AND static 
    public static function handleNewUser(EventUser $event) 
    { 
     // $event->user contain the "input" object 
     echo 'mail sent to admin for'. $event->user->username; 
    } 
} 

Внутри составной части конфигурации под (в данном случае) Гильза пользователя вы:

'components' => [ 
    'user' => [ 
    ... 
    'on new-user' => ['your\handler\Event\Namespace\handlerClass', 'handleNewUser'], 
    ], 
    ... 
] 

Тогда в вашем коде вы можете активировать событие:

Yii::$app->user->trigger(EventUser::EVENT_NEW_USER, new EventUser($user)); 

ADD

Вы также можете использовать замыкание:

  • позволяет IDE для "обнаружить" использование функции (для навигации по коду)
  • положить некоторые (маленький), которые управляют событием

пример:

'components' => [ 
    'user' => [ 
    ... 
    'on new-user' => function($param){ your\handler\Event\Namespace\handlerClass::handleNewUser($param);}, 
    'on increment' => function($param){ \Yii::$app->count += $param->value;}, 
    ], 
    ... 
] 
2

По умолчанию Yii2 уже обеспечивают некоторую декларацию событий, Вы можете прочитать больше о объяснении на BaseActiveRecord.

Вы можете использовать эту переменную так же, как декларировать ее вручную.

public function init() 
{ 
    parent::init(); 

    $this->on(self::EVENT_AFTER_INSERT, [$this, 'exampleMethodHere']); 
} 
Смежные вопросы