function() { return $this->getAccount()->id; }], ['password', PasswordRequiredValidator::class], ]; } public function change() : bool { if (!$this->validate()) { return false; } $account = $this->getAccount(); if ($this->username === $account->username) { return true; } $transaction = Yii::$app->db->beginTransaction(); try { $oldNickname = $account->username; $account->username = $this->username; if (!$account->save()) { throw new ErrorException('Cannot save account model with new username'); } $usernamesHistory = new UsernameHistory(); $usernamesHistory->account_id = $account->id; $usernamesHistory->username = $account->username; if (!$usernamesHistory->save()) { throw new ErrorException('Cannot save username history record'); } $this->createEventTask($account->id, $account->username, $oldNickname); $transaction->commit(); } catch (Exception $e) { $transaction->rollBack(); throw $e; } return true; } /** * TODO: вынести это в отдельную сущность, т.к. эта команда используется внутри формы регистрации * * @param integer $accountId * @param string $newNickname * @param string $oldNickname * @throws \PhpAmqpLib\Exception\AMQPExceptionInterface */ public function createEventTask($accountId, $newNickname, $oldNickname) { $model = new UsernameChanged; $model->accountId = $accountId; $model->oldUsername = $oldNickname; $model->newUsername = $newNickname; $message = Amqp::getInstance()->prepareMessage($model, [ 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, ]); Amqp::sendToEventsExchange('accounts.username-changed', $message); } protected function getAccount() : AccountIdentity { return Yii::$app->user->identity; } }