Добрый день, есть сайт и форум со связанными аккаунтами. При регистрации пользователя на сайте, по задумке, должен создаваться профиль и на форуме с идентичными данными.
Ниже прикреплен класс, отвечающий за регистрацию пользователя на различных ресурсах (в данном случае на сайте и форуме). В нём содержится метод registerComplex(), который создаёт аккаунты пользователя сразу на обеих площадках. Так вот, сперва приходится выполнять форумную регистрацию, так как для создания аккаунта на сайте необходимо уже иметь id форумного профиля (внешний ключ, если короче), что приводит к следующему неприятному инциденту: если регистрация на сайте пройдёт неудачно, то форумный аккаунт никуда не исчезает. Была мысль посылать запрос на удаление (delete: user/{id}/) в случае данной ошибки, но опять-таки проблема может возникнуть и при выполнении данного запроса, а что делать дальше уже непонятно...
Как быть в данной ситуации? Есть ли возможность откатить регистрацию или нужно искать иной вариант решения? Спасибо!
Ниже прикреплен класс, отвечающий за регистрацию пользователя на различных ресурсах (в данном случае на сайте и форуме). В нём содержится метод registerComplex(), который создаёт аккаунты пользователя сразу на обеих площадках. Так вот, сперва приходится выполнять форумную регистрацию, так как для создания аккаунта на сайте необходимо уже иметь id форумного профиля (внешний ключ, если короче), что приводит к следующему неприятному инциденту: если регистрация на сайте пройдёт неудачно, то форумный аккаунт никуда не исчезает. Была мысль посылать запрос на удаление (delete: user/{id}/) в случае данной ошибки, но опять-таки проблема может возникнуть и при выполнении данного запроса, а что делать дальше уже непонятно...
Как быть в данной ситуации? Есть ли возможность откатить регистрацию или нужно искать иной вариант решения? Спасибо!
PHP:
<?php
namespace models\user;
use components\exceptions\failed\registration\ForumRegistrationFailedException as ForumRegistrationFailedException;
use components\exceptions\failed\registration\SiteRegistrationFailedException as SiteRegistrationFailedException;
use GuzzleHttp\Client as XFClient;
use GuzzleHttp\Exception\ClientException as XFClientException;
class Registration {
private $_username,
$_email,
$_password;
public function __construct(string $username, string $email, string $password) {
$this->_username = $username;
$this->_email = $email;
$this->_password = $password;
}
//Регистрация аккаунта на сайте
public function registerOnSite(\PDO $DbConnect, $xfUserId = null) : string {
try {
$passwordHash = password_hash($this->_password, PASSWORD_BCRYPT);
$activationCode = password_hash($this->_username, PASSWORD_BCRYPT);
$WritingQuery = $DbConnect->prepare('INSERT INTO site_user(username, email, password, activation_code, xf_user_id) VALUES (:username, :email, :password, :activation_code, :xf_user_id)');
$WritingQuery->bindParam(':username', $this->_username);
$WritingQuery->bindParam(':email', $this->_email);
$WritingQuery->bindParam(':password', $passwordHash);
$WritingQuery->bindParam(':activation_code', $activationCode);
$WritingQuery->bindParam(':xf_user_id', $xfUserId);
$WritingQuery->execute();
} catch (\PDOException $Exception) {
$message = "Возникла ошибка при регистрации аккаунта $this->_username с адресом $this->_email на сайте. Пожалуйста, обратитесь к администрации проекта.";
throw new SiteRegistrationFailedException($Exception, $message);
}
return $activationCode;
}
//Регистрация аккаунта на форуме
public function registerOnForum() : int {
try {
require_once ROOT_PATH . '/forum/src/vendor/autoload.php';
$Client = new XFClient();
$params = [
'headers' => [
'XF-Api-Key' => 'ключ',
'XF-Api-User' => '1'
],
'form_params' => [
'username' => $this->_username,
'password' => $this->_password,
'email' => $this->_email,
'user_state' => 'moderated'
]
];
$ClientAnswer = $Client->post('mvc.caelestis/forum/api/users', $params);
$answerBody = json_decode($ClientAnswer->getBody(), true);
} catch (XFClientException $Exception) {
$message = "Возникла ошибка при регистрации аккаунта $this->_username с адресом $this->_email на форуме. Пожалуйста, обратитесь к администратрации проекта.";
throw new ForumRegistrationFailedException($Exception, $message);
}
return $answerBody['user']['user_id'];
}
//Комплексная регистрация (на сайте и на форуме)
public function registerComplex(\PDO $DbConnect) : string {
$activationCode;
try {
$xfUserId = $this->registerOnForum();
$activationCode = $this->registerOnSite($DbConnect, $xfUserId);
} catch (ForumRegistrationFailedException | SiteRegistrationFailedException $Exception) {
throw $Exception;
}
return $activationCode;
}
}
?>