Создание своих событий в Yii2

24 апреля, 2018
Метки:

События — это возможность вызвать какой-то код, когда код дошел до какой-то точки выполнения. Какой именно код? Любой. Прелесть событий в том, что на одно событие можно “повесить” выполнение любого количества методов. Если вы знакомы с хуками в WordPress то работают они по тому-же принципу: выполнение программы доходит до определенной точки, выполняет все методы что “повесили” на этот хук и дальше продолжается работа самого WP.

Когда это нужно? Разработчики фреймворка не могут учесть все возможные сценарии использования. Встроенные события — это способ дать разработчикам возможность выполнять свой код, в середине процесса работы фреимворка. Например: вам нужно поменять что-то в ответе (response) после того как выполнение приложения уже закончилось. Но вы не занимаетесь отправкой response, это за вас делает фреимворк. Если бы разработчики фреимворка не позаботились бы об этом, вам бы пришлось предопределять метод send класса yii\web\Response чтобы добавить вызов своего метода. Взгляните на код метода send:

public function send()
{
   if ($this->isSent) {
       return;
   }
//Сделай все что нужно до отправки запроса
   $this->trigger(self::EVENT_BEFORE_SEND);
   $this->prepare();
//Сделай все что нужно после того как ответ уже готов, но еще не отправлен
   $this->trigger(self::EVENT_AFTER_PREPARE);
   $this->sendHeaders();
   $this->sendContent();
//Сделай все что нужно после того как ответ отправлен
   $this->trigger(self::EVENT_AFTER_SEND);
   $this->isSent = true;
}

Разработчики фреимворка оставили нам “хуки”, возможность выполнить нашу логику между стадиями отправки ответа сервера самым простым из возможных способов.

Event::on(Response::class, Response::EVENT_BEFORE_SEND, function ($event) {
   //делаем что нужно
});

И не пришлось ничего переопределять и усложнять. Вот тут есть список стандартных событий, которые уже есть в Yii2. Они же есть в коде Yii2. Тут собраны только для того, чтобы иметь весь список сразу перед глазами.

Делаем свое событие

Если вы делаете какой-то компонент, который планируете использовать и в других проектах стоит подумать о том, чтобы добавить ему гибкости, создав свои события. Например: вы делаете универсальный модуль для управления пользователями. Оставьте событие — afterUserHasBeenCreated и если тому, кто воспользуется вашим модулем нужно будет сделать что-то после того как пользователь создался — ему не придется переписывать что-то в вашем модуле.

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

$this->trigger(self::EVENT_USER_HAS_BEEN_CREATED);

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

Но события нужны не только тогда, когда вы не знаете, кто и что захочет выполнить в такой-то момент работы программы, но и тогда, когда одно и тоже событие может случится много раз. Например делаем свой обработчик логических ошибок программы.

Yii::$app->on('oops', function ($event) {
    //обрабатываем нашу ошибку
});

Теперь везде где нам нужна такая обработка вызываем наше событие:

Yii::$app->trigger('oops', new Event(['data' => $someData]));

В качестве параметра метода trigger принимает объект класса yii\base\Event. Это позволяет отличить контекст вызова события при его обработке.

В заключение: одно и тоже событие может вызываться в разных местах приложения. На одно событие можно повесить выполнение множества обработчиков.

Существует много способов как объявлять события так и вызывать метод trigger класса yii\base\Component и все они описаны в документации. Задача этой статьи — не столько объяснить как использовать события, сколько объяснить что это вообще такое и зачем оно нужно. Надеюсь мне это удалось. А если остались вопросы — пишите комментарии.


Метки:

Оставить комментарий

Ты будешь первым :)

Оставить комментарий:









Копирование материалов разрешено при наличии активной ссылки на источник