Używam HWIOAuthBundle, aby umożliwić logowanie użytkownika z Oauth, utworzyłem niestandardowego dostawcę użytkownika, który tworzy użytkownika na wypadek, gdyby go nie było:Symfony2: Dokonaj pełnej rejestracji użytkownika po zalogowaniu, jeśli brakuje niektórych pól.
public function loadUserByOAuthUserResponse(UserResponseInterface $response)
{
$attr = $response->getResponse();
switch($response->getResourceOwner()->getName()) {
case 'google':
if(!$user = $this->userRepository->findOneByGoogleId($attr['id'])) {
if(($user = $this->userRepository->findOneByEmail($attr['email'])) && $attr['verified_email']) {
$user->setGoogleId($attr['id']);
if(!$user->getFirstname()) {
$user->setFirstname($attr['given_name']);
}
if(!$user->getLastname()) {
$user->setLastname($attr['family_name']);
}
$user->setGoogleName($attr['name']);
}else{
$user = new User();
$user->setUsername($this->userRepository->createUsernameByEmail($attr['email']));
$user->setEmail($attr['email']);
$user->setFirstname($attr['given_name']);
$user->setLastname($attr['family_name']);
$user->setPassword('');
$user->setIsActive(true);
$user->setGoogleId($attr['id']);
$user->setGoogleName($attr['name']);
$user->addGroup($this->groupRepository->findOneByRole('ROLE_USER'));
$this->entityManager->persist($user);
}
}
break;
case 'facebook':
if(!$user = $this->userRepository->findOneByFacebookId($attr['id'])) {
if(($user = $this->userRepository->findOneByEmail($attr['email'])) && $attr['verified']) {
$user->setFacebookId($attr['id']);
if(!$user->getFirstname()) {
$user->setFirstname($attr['first_name']);
}
if(!$user->getLastname()) {
$user->setLastname($attr['last_name']);
}
$user->setFacebookUsername($attr['username']);
}else{
$user = new User();
$user->setUsername($this->userRepository->createUsernameByEmail($attr['email']));
$user->setEmail($attr['email']);
$user->setFirstname($attr['first_name']);
$user->setLastname($attr['last_name']);
$user->setPassword('');
$user->setIsActive(true);
$user->setFacebookId($attr['id']);
$user->setFacebookUsername($attr['username']);
$user->addGroup($this->groupRepository->findOneByRole('ROLE_USER'));
$this->entityManager->persist($user);
}
}
break;
}
$this->entityManager->flush();
if (null === $user) {
throw new AccountNotLinkedException(sprintf("User '%s' not found.", $attr['email']));
}
return $user;
}
Problem polega na tym, że twitter na przykład nie wysyła wiadomości e-mail lub chcę, aby dodatkowe pola zostały uwzględnione przed utworzeniem nowego użytkownika. Czy istnieje sposób przekierowania użytkownika do formularza "pełnej rejestracji" przed jego utworzeniem?
Próbowałem dodać detektor żądania, aby na każde żądanie, jeśli użytkownik jest zalogowany, sprawdza, czy e-mail tam jest, a jeśli nie, przekierowuje do strony complete_registration, ale przekieruje również, jeśli użytkownik przechodzi na stronę główną, wylogowuje się lub cokolwiek innego, chcę przekierować go tylko wtedy, gdy próbuje uzyskać dostęp do niektórych stron z ograniczeniami.
Albo lepiej, nie twórz go, dopóki nie poda wszystkich wymaganych informacji.
@elnur co redagowałeś? żeby się dowiedzieć, czy coś było nie tak – alex88
Kliknij na ostatni znacznik czasu edycji i przekonaj się sam. –
Co za niegrzeczna odpowiedź, zły humor dzisiaj? – alex88