TimestampBehavior::class, 'updatedAtAttribute' => false, ], 'expirationBehavior' => [ 'class' => EmailActivationExpirationBehavior::class, 'repeatTimeout' => 5 * 60, // 5m 'expirationTimeout' => -1, ], 'dataBehavior' => [ 'class' => DataBehavior::class, 'attribute' => '_data', ], ]; } public function getAccount() { return $this->hasOne(Account::class, ['id' => 'account_id']); } /** * @inheritdoc */ public static function instantiate($row) { $type = ArrayHelper::getValue($row, 'type'); if ($type === null) { return new static; } $classMap = self::getClassMap(); if (!isset($classMap[$type])) { throw new InvalidConfigException('Unexpected type'); } return new $classMap[$type]; } public static function getClassMap() { return [ self::TYPE_REGISTRATION_EMAIL_CONFIRMATION => confirmations\RegistrationConfirmation::class, self::TYPE_FORGOT_PASSWORD_KEY => confirmations\ForgotPassword::class, self::TYPE_CURRENT_EMAIL_CONFIRMATION => confirmations\CurrentEmailConfirmation::class, self::TYPE_NEW_EMAIL_CONFIRMATION => confirmations\NewEmailConfirmation::class, ]; } public function beforeSave($insert) { if (!parent::beforeSave($insert)) { return false; } if ($this->key === null) { do { $this->key = UserFriendlyRandomKey::make(); } while (EmailActivation::find()->andWhere(['key' => $this->key])->exists()); } return true; } }