/** * Возвращает true при успешной операции или строку с ошибкой * * @param $money * @param $recipient * * @return bool|string * * @throws Exception */ public static function sendMoney($money, $recipient) { // Проверка входных данных (только положительные числа) if (!preg_match('/^\\d*\\.?\\d*$/', $money)) { return 'Введите положительное число'; } $transaction = Yii::$app->db->beginTransaction(); $transaction->setIsolationLevel('SERIALIZABLE'); try { // Вычесть деньги у отправителя Users::sendMoney($money, Yii::$app->user->id); // Прибавить полуателю Users::addMoney($money, $recipient); // Записать операцию $operation = new self(); $operation->sum = $money; $operation->recipient = $recipient; $operation->link('sender', Users::findOne(Yii::$app->user->id)); $transaction->commit(); // Ошибок нет return true; } catch (OperationException $e) { $transaction->rollback(); return $e->getMessage(); } catch (Exception $e) { $transaction->rollback(); if (YII_DEBUG) { throw $e; } else { return 'Неизвестная ошибка'; } } }