События Yii2: как добавить несколько обработчиков событий, используя метод событий поведения?

Вот мой метод класса Behavior events(). Когда я запускаю второй обработчик события, то есть sendMailHanlder, вызывается и игнорирует anotherOne. Я считаю, что второй перезаписывает первый. Как решить эту проблему, чтобы вызывались оба обработчика событий?

    // UserBehavior.php
    public function events()
    {
        return [
            Users::EVENT_NEW_USER => [$this, 'anotherOne'],
            Users::EVENT_NEW_USER => [$this, 'sendMailHanlder'],
        ];
    }
    // here are two handlers
    public function sendMailHanlder($e)
    {
        echo ";
    }
    public function anotherOne($e)
    {
        echo 'another one';
    }

Следует отметить, что я привязываю это поведение к моей модели Users.php. Я попытался добавить оба обработчика, используя метод модели init(). Таким образом были вызваны оба обработчика. Вот мой код инициализации.

public function init()
{
    $this->on(self::EVENT_NEW_USER, [$this, 'anotherOne']);
    $this->on(self::EVENT_NEW_USER, [$this, 'sendMailHanlder']);
}

person Ejaz Karim    schedule 18.02.2015    source источник


Ответы (3)


Вы можете переопределить Behavior::attach(), чтобы вы могли иметь что-то подобное в своем UserBehavior и не нуждаться в ваших событиях()

    // UserBehavior.php
    public function attach($owner)
    {
        parent::attach($owner);
        $owner->on(self::EVENT_NEW_USER, [$this, 'anotherOne']);
        $owner->on(self::EVENT_NEW_USER, [$this, 'sendMailHanlder']);
    }
person jovani    schedule 19.02.2015

Вы можете использовать анонимную функцию для присоединения обработчика в методе событий:

ActiveRecord::EVENT_AFTER_UPDATE => function ($event) {
    $this->deleteRemovalRequestFiles();
    $this->uploadFiles();
}
person Amirreza Yeganegi    schedule 22.02.2019

Вы не должны использовать одинаковые имена событий. Используйте это вместо этого:

 public function events()
 {
     return [
         Users::EVENT_NEW_USER => [$this, 'sendMailHanlder'],
     ];
 }

 // Here are two handlers
 public function sendMailHanlder($e)
 {
     echo '';
     $this->anotherOne($e);
 }

 public function anotherOne($e)
 {
     echo 'another one';
 }
person vitalik_74    schedule 18.02.2015