Как вообще работают события?

События похожи на уведомления в соц-сетях. Когда человек к которому вы подписаны публикует новый пост, вам придет уведомление. То есть вы подписаны на определенные действия человека.

Приведу аналогию из реальной жизни: Допустим вы с другом решили пойти в кино. Договорились встретиться у входа кинотеатра. Вы попросили друга позвонить вам когда он прибудет на место встречи. Так вот "Прибывание на место встречи" вашего друга и есть СОБЫТИЕ. Вы подписались на это событие и дали указания другу, сделать определенные действия, то есть позвонить вам когда произойдет событие.

В Yii2 по умолчанию есть несколько событий, которые произойдут в определенное время. Например после подключения к БД, перед сохранением данных в БД, события связанные с авторизацией, события уровня запросов итд итп.

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

В приведенном ниже коде, мы подписываемся на событие EVENT_AFTER_ACTION текущего контроллера. Здесь в роли обработчика выступает анонимная функция.

    
        <?php
        namespace app\controllers;
        use yii\web\Controller;

        class MainController extends Controller
        {
            public function actionIndex()
            {
                $this->on(yii\web\Controller::EVENT_AFTER_ACTION, function () {
                    echo 'Hello world!';
                });
                return $this->render('index');
            }
        }
    
Так же вместо анонимной функции можно использовать:
    
        //метод объекта
        $this->on(yii\web\Controller::EVENT_AFTER_ACTION, [$object, 'methodName']);

        //статический метод класса
        $this->on(yii\web\Controller::EVENT_AFTER_ACTION, ['app\models\MyModel', 'methodName']);

        //глобальная функция
        $this->on(yii\web\Controller::EVENT_AFTER_ACTION, 'functionName');
    

Зачем нужны события?

Если кратко, то события нужны для внедрения своего кода в сторонний код без изменения стороннего кода. События помогают создать слабосвязанную систему. То есть, если над проектом работают несколько человек, например тот кто пишет модуль для регистрации в свой код добавит несколько событий. Он не обязан знать что произойдет после регистрации юзера. А программист который пишет модуль смс оповещения может подписаться на события модуля регистрации. И тогда после регистрации юзера автоматически отправится смс админу, юзеру итд. итп.


Когда следует использовать события?

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

Ниже приведен список событий в Yii2.

    
    Yii2-события для MVC
    Веб-представление, которое наследуется от yii\web\View
    EVENT_BEGIN_BODY
    EVENT_END_BODY

    Model
    EVENT_AFTER_VALIDATE
    EVENT_BEFORE_VALIDATE

    Module или Controller
    EVENT_AFTER_ACTION - afterAction
    EVENT_BEFORE_ACTION - beforeAction

    Компонент представления
    yii\base\View
    EVENT_AFTER_RENDER
    EVENT_BEFORE_RENDER
    EVENT_END_PAGE
    EVENT_BEGIN_PAGE

    Cвязанные с БД
    yii\db\BaseActiveRecord
    EVENT_INIT
    EVENT_AFTER_FIND
    EVENT_BEFORE_INSERT (перед сохранением данных в БД)
    EVENT_AFTER_INSERT
    EVENT_BEFORE_UPDATE
    EVENT_AFTER_UPDATE
    EVENT_BEFORE_DELETE
    EVENT_AFTER_DELETE
    yii\db\ActiveQuery
    EVENT_INIT
    yii\db\Connection
    EVENT_AFTER_OPEN (после подключения к БД)
    EVENT_BEGIN_TRANSACTION
    EVENT_COMMIT_TRANSACTION
    EVENT_ROLLBACK_TRANSACTION

    Yii2-события уровня запросов
    yii\base\Application
    EVENT_BEFORE_REQUEST - beforeRequest
    EVENT_AFTER_REQUEST - afterRequest
    yii\web\Response
    EVENT_BEFORE_SEND
    EVENT_AFTER_SEND
    EVENT_AFTER_PREPARE

    Yii2-события для компонентов по умолчанию
    yii\i18n\MessageSource
    EVENT_MISSING_TRANSLATION
    yii\mail\BaseMailer
    EVENT_BEFORE_SEND
    EVENT_AFTER_SEND

    yii\web\User События связанные с авторизацией
    EVENT_BEFORE_LOGIN
    EVENT_AFTER_LOGIN
    EVENT_BEFORE_LOGOUT
    EVENT_AFTER_LOGOUT