← Назад к вопросам

Какие методы триггерятся в Yii2?

2.0 Middle🔥 142 комментариев
#Фреймворки

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Обзор жизненного цикла и триггерных методов в Yii2

В Yii2 существует множество "триггерных" методов (также называемых событиями или хуками), которые автоматически вызываются фреймворком в процессе жизненного цикла компонентов, моделей, контроллеров и приложения. Эти методы можно разделить на несколько ключевых категорий.

1. События жизненного цикла компонентов и моделей

Yii\Base\Component и его наследники (включая модели) поддерживают систему событий. Основные триггерные методы:

// Пример для модели ActiveRecord
class User extends \yii\db\ActiveRecord
{
    public function beforeSave($insert)
    {
        if (!parent::beforeSave($insert)) {
            return false; // Прерываем сохранение
        }
        $this->updated_at = time();
        return true;
    }
    
    public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes);
        // Логирование изменений
    }
}

Ключевые методы моделей ActiveRecord:

  • beforeValidate() / afterValidate() — до/после валидации
  • beforeSave() / afterSave() — до/после сохранения в БД
  • beforeInsert() / afterInsert() — до/после INSERT-операции
  • beforeUpdate() / afterUpdate() — до/после UPDATE-операции
  • beforeDelete() / afterDelete() — до/после удаления записи
  • afterFind() — после выборки из БД (не вызывается для новых записей)

2. События жизненного цикла контроллеров

Контроллеры в Yii2 также имеют свои триггерные методы:

class SiteController extends \yii\web\Controller
{
    public function beforeAction($action)
    {
        if (!parent::beforeAction($action)) {
            return false; // Прерываем выполнение action
        }
        
        // Проверка доступа
        if ($action->id === 'admin' && Yii::$app->user->isGuest) {
            return $this->redirect(['login']);
        }
        
        return true;
    }
    
    public function afterAction($action, $result)
    {
        $result = parent::afterAction($action, $result);
        // Логирование выполнения действия
        return $result;
    }
}

3. События приложения (Application Events)

Объект приложения Yii2 генерирует события на разных этапах:

// В конфигурации приложения
return [
    'id' => 'app',
    'on beforeRequest' => function ($event) {
        // Инициализация перед обработкой запроса
    },
    'on afterRequest' => function ($event) {
        // Очистка после обработки запроса
    },
];

Основные события приложения:

  • EVENT_BEFORE_REQUEST — перед обработкой входящего запроса
  • EVENT_AFTER_REQUEST — после отправки ответа
  • EVENT_BEFORE_ACTION — перед выполнением action контроллера (глобальный)
  • EVENT_AFTER_ACTION — после выполнения action контроллера (глобальный)

4. События поведения (Behaviors)

Поведения могут прикреплять обработчики к событиям компонента:

class TimestampBehavior extends \yii\base\Behavior
{
    public function events()
    {
        return [
            \yii\db\ActiveRecord::EVENT_BEFORE_INSERT => 'beforeInsert',
            \yii\db\ActiveRecord::EVENT_BEFORE_UPDATE => 'beforeUpdate',
        ];
    }
    
    public function beforeInsert($event)
    {
        $this->owner->created_at = time();
        $this->owner->updated_at = time();
    }
}

5. События виджетов и компонентов

Многие компоненты Yii2 генерируют собственные события:

Для \yii\web\User (аутентификация):

  • EVENT_BEFORE_LOGIN / EVENT_AFTER_LOGIN
  • EVENT_BEFORE_LOGOUT / EVENT_AFTER_LOGOUT

Для \yii\db\Connection (работа с БД):

  • EVENT_AFTER_OPEN — после установки соединения
  • EVENT_BEGIN_TRANSACTION / EVENT_COMMIT_TRANSACTION / EVENT_ROLLBACK_TRANSACTION

6. Пользовательские события

Разработчики могут создавать и триггерить собственные события:

class OrderService extends \yii\base\Component
{
    const EVENT_ORDER_CREATED = 'orderCreated';
    
    public function createOrder($data)
    {
        // Создание заказа...
        
        // Триггерим пользовательское событие
        $this->trigger(self::EVENT_ORDER_CREATED, new \yii\base\Event([
            'data' => $orderData
        ]));
    }
}

Ключевые принципы работы:

  1. Порядок вызова: События вызываются в порядке прикрепления обработчиков
  2. Прерывание цепочки: Возврат false в before- событиях обычно прерывает выполнение
  3. Наследование: Все триггерные методы должны вызывать родительскую реализацию (parent::methodName())
  4. Гибкость: Можно прикреплять обработчики как через переопределение методов, так и через конфигурацию

Важное замечание: Не все методы в Yii2 являются событиями в классическом понимании — некоторые представляют собой шаблонные методы (template methods), которые нужно переопределять, а не подписываться на них. Различие заключается в том, что события поддерживают множественные обработчики, а шаблонные методы — одиночное переопределение.

Понимание системы событий Yii2 критически важно для создания расширяемых, поддерживаемых приложений, так как она позволяет реализовывать слабую связность компонентов и соблюдать принцип открытости/закрытости (Open/Closed Principle).

Какие методы триггерятся в Yii2? | PrepBro