Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Обзор жизненного цикла и триггерных методов в 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_LOGINEVENT_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
]));
}
}
Ключевые принципы работы:
- Порядок вызова: События вызываются в порядке прикрепления обработчиков
- Прерывание цепочки: Возврат
falseвbefore-событиях обычно прерывает выполнение - Наследование: Все триггерные методы должны вызывать родительскую реализацию (
parent::methodName()) - Гибкость: Можно прикреплять обработчики как через переопределение методов, так и через конфигурацию
Важное замечание: Не все методы в Yii2 являются событиями в классическом понимании — некоторые представляют собой шаблонные методы (template methods), которые нужно переопределять, а не подписываться на них. Различие заключается в том, что события поддерживают множественные обработчики, а шаблонные методы — одиночное переопределение.
Понимание системы событий Yii2 критически важно для создания расширяемых, поддерживаемых приложений, так как она позволяет реализовывать слабую связность компонентов и соблюдать принцип открытости/закрытости (Open/Closed Principle).