Как мне написать провайдера пользователя для HWIOAuthBundle

Я хочу написать функцию входа в систему через социальные сети.
если пользователь не вошел в систему, он сохраняет его в базе данных, если пользователь существует, войдите в систему. Что я должен написать в моем провайдере? Документы заявляют:

Пакету нужна служба, которая может загружать пользователей на основе пользовательского ответа конечной точки oauth. Если у вас есть настраиваемая служба, она должна реализовывать интерфейс: HWI \ Bundle \ OAuthBundle \ Security \ Core \ User \ OAuthAwareUserProviderInterface.

Так вот что я написал, а потом застрял

<?php
namespace ng\MyBundle\Controller\Listeners;

use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthAwareUserProviderInterface;

class OAuthUserProvider implements OAuthAwareUserProviderInterface
{

}

Можете ли вы сказать мне, какие методы мне следует использовать?
Кто-нибудь может привести мне пример провайдера, не использующего FOSuserBundle?
Спасибо


person Aysennoussi    schedule 05.11.2014    source источник
comment
Я не знаю, используете ли вы FOS или нет, но в этой gist есть прекрасный пример. тем не менее   -  person stevenll    schedule 05.11.2014
comment
Это моя проблема. Я не использую FOSuserBundle .. Я сохраняю пользователей вручную.   -  person Aysennoussi    schedule 05.11.2014
comment
В интерфейсе есть только один метод, посмотрите на суть, и вы сможете создать свою собственную реализацию.   -  person stevenll    schedule 05.11.2014
comment
Я не вижу, где они использовали OAuthAwareUserProviderInterface. а какой метод для интерфейса?   -  person Aysennoussi    schedule 05.11.2014
comment
Я нашел функцию это общедоступная функция loadUserByOAuthUserResponse (UserResponseInterface $ response);   -  person Aysennoussi    schedule 05.11.2014


Ответы (1)


Если вы откроете интерфейс OAuthAwareUserProviderInterface, вы увидите, что у него есть только один метод:

/**
 * Loads the user by a given UserResponseInterface object.
 *
 * @param UserResponseInterface $response
 *
 * @return UserInterface
 *
 * @throws UsernameNotFoundException if the user is not found
 */
public function loadUserByOAuthUserResponse(UserResponseInterface $response);

Ниже приведен пример того, как это реализовать. Конечно, в вашем случае вам следует позвонить своим менеджерам сущностей и получить доступ к пользователям так, как вы это спроектировали.

/**
 * {@inheritdoc}
 */
 public function loadUserByOAuthUserResponse(UserResponseInterface $response)
 {
   $username = $response->getUsername();
   $user = $this->userManager->findUserBy(array($this->getProperty($response) => $username));
   //when the user is registrating
   if (null === $user) {
       $service = $response->getResourceOwner()->getName();
       $setter = 'set'.ucfirst($service);
       $setter_id = $setter.'Id';
       $setter_token = $setter.'AccessToken';
       // create new user here
       $user = $this->userManager->createUser();
       $user->$setter_id($username);
       $user->$setter_token($response->getAccessToken());
       //I have set all requested data with the user's username
       //modify here with relevant data
       $user->setUsername($username);
       $user->setEmail($username);
       $user->setPassword($username);
       $user->setEnabled(true);
       $this->userManager->updateUser($user);
       return $user;
    }

    //if user exists - go with the HWIOAuth way
    $user = parent::loadUserByOAuthUserResponse($response);

    $serviceName = $response->getResourceOwner()->getName();
    $setter = 'set' . ucfirst($serviceName) . 'AccessToken';

    //update access token
    $user->$setter($response->getAccessToken());

    return $user;
}
person stevenll    schedule 05.11.2014
comment
Я понял это! Все, что у меня сейчас есть, это разработать свой класс для mongodb вместо mysql, спасибо большое - person Aysennoussi; 05.11.2014