client = $client; $this->query = $query; } /** * @return object */ public function run() { $data = $this->client->getUserAttributes(); /** @var SocialNetworkAccount $account */ $account = Yii::createObject( [ 'class' => SocialNetworkAccount::class, 'provider' => $this->client->getId(), 'client_id' => $data['id'], 'data' => json_encode($data), 'username' => $this->client->getUserName(), 'email' => $this->client->getEmail() ] ); if (($user = $this->getUser($account)) instanceof User) { $account->user_id = $user->id; } $account->save(false); return $account; } protected function getUser(SocialNetworkAccount $account) { $user = $this->query->whereEmail($account->email)->one(); if (null !== $user) { return $user; } /** @var User $user */ $user = Yii::createObject( 'User', [ 'scenario' => 'connect', 'username' => $account->username, 'email' => $account->email ] ); if (!$user->validate(['email'])) { $user->email = null; } if (!$user->validate(['username'])) { $user->username = null; } return Yii::$container->get(UserCreateService::class, [$user])->run() ? $user : false; } }