Чтобы указать параметр OAuth для входа в facebook с помощью symfony2 / HWIOAuthBundle

Этот вопрос связан с этой статьей

Я много раз гуглил и уточнил проблему.

У меня очень простой вопрос.

Могу ли я передать параметр отсюда (например: myStatus = 1)

<a href="{{ path('hwi_oauth_service_redirect', { 'service' : 'facebook' }) }}" />facebook</a>

в этот класс?

FOSUBUserProvider класс MyUserBundle \ Security \ Core \ User

class FOSUBUserProvider extends BaseClass
{ 
    protected $container;
    public function __construct(UserManagerInterface $userManager, $container, array $properties)     
    {
        $this->userManager = $userManager;
        $this->container = $container;
        $this->properties  = $properties;
    }

    /**
     * {@inheritDoc}
     */
    public function connect(UserInterface $user, UserResponseInterface $response)
    {
        $property = $this->getProperty($response);
        $username = $response->getUsername();

         //I WANT TO USE THE myStatus PARAMTER HERE!!!

        //on connect - get the access token and the user ID
        $service = $response->getResourceOwner()->getName();

        $setter = 'set'.ucfirst($service);
        $setter_id = $setter.'Id';
        $setter_token = $setter.'AccessToken';

        //we "disconnect" previously connected users
        if (null !== $previousUser = $this->userManager->findUserBy(array($property => $username))) {
            $previousUser->$setter_id(null);
            $previousUser->$setter_token(null);
            $this->userManager->updateUser($previousUser);
        }
        //we connect current user
        $user->$setter_id($username);
        $user->$setter_token($response->getAccessToken());

        $this->userManager->updateUser($user);
    }

    /**
     * {@inheritdoc}
     */
    public function loadUserByOAuthUserResponse(UserResponseInterface $response)
    {
        $username = $response->getUsername();
        $user_details= $response->getResponse();
        $user = $this->userManager->findUserBy(array('email' => $user_details['email']));

          //when the user is registering
        if (null === $user) {
            $em = $this->container->get('doctrine')->getManager();

            $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
            $avatar   = $response->getProfilePicture();

            $user->setUsername($username);
            $user->setFirstName($user_details['first_name']);
            $user->setLastName($user_details['last_name']);
            $user->setUserKey($this->generateRandomString());
            $user->setEmail($user_details['email']);      
            $user->setPassword($this->generateRandomString());
            $user->setEnabled(true);
            $this->userManager->updateUser($user);
            return $user;
        }

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

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

        return $user;
    }

в моем config.yml

hwi_oauth:
    # name of the firewall in which this bundle is active, this setting MUST be set
    connect:
        account_connector: my_user_provider
    fosub:
        username_iterations: 30
        properties:
            # these properties will be used/redefined later in the custom FOSUBUserProvider service.
            facebook: facebook_id
    firewall_name: main
    resource_owners:
        facebook:
            type:                facebook
            client_id:           ******
            client_secret:       *******
            scope:               "email,public_profile"
            options:
                display: popup

мой services.xml

   <services>
     <service id="my_user_provider" class="Acme\UserBundle\Security\Core\User\FOSUBUserProvider">
        <argument type="service" id="fos_user.user_manager"/>
        <argument type="service" id="service_container" />

        <argument type="collection">
            <argument key="facebook">facebook_id</argument>
            <argument key="google">google_id</argument>
            <argument key="twitter">twitter_id</argument>
        </argument>

    </service>

person whitebear    schedule 18.05.2015    source источник


Ответы (1)


Я никогда не работал с HWIOAuthBundle, но предполагаю, что вы вводите контейнер службы с аргументом $container. Итак, у нас есть доступ к сервисному контейнеру, мы можем просто получить доступ к request_stack сервису с его помощью и получить от него параметры строки запроса ..

пример:

<a href="{{ path('hwi_oauth_service_redirect', { 'service' : 'facebook', 'myStatus':1 }) }}" />facebook</a>

метод подключения:

public function connect(UserInterface $user, UserResponseInterface $response)
{
     $property = $this->getProperty($response);
     $username = $response->getUsername();

     $request = $this->container->get('request_stack')->getCurrentRequest();

     $myStatus = $request->query->get('myStatus');
person xurshid29    schedule 18.05.2015
comment
Спасибо xurshid29. Я пробовал этот способ, но все равно $ myStatus имеет значение null. Я предполагаю, что аргумент service 'myStatus' не отправляется напрямую для метода подключения, так как он перенаправляется в класс FOSUBUserProvider через какое-то место. - person whitebear; 19.05.2015
comment
URL-адрес, написанный в twig, отображается в html следующим образом. ‹a href=/myApp/web/app_dev.php/login/facebook?myStatus=1 /› - person whitebear; 19.05.2015
comment
@whitebear Попробуй распечатать request_stack объект (var_dump($this->container->get('request_stack')) или использовать метод dump), уверен, что в стеке что-то будет .. - person xurshid29; 19.05.2015
comment
Привет @ xurshid29 Я не могу найти что-то связанное с myStatus, вместо этого я использую referer для достижения своей цели. - person whitebear; 20.05.2015