Laravel Socialite расширяет поля

В основном я хочу получить ссылку на профиль пользователя от Linkedin. Я использую Laravel Socialite с Socialite Providers для получения информации от Linkedin.

Когда пользователь успешно перенаправляется обратно на мой сайт, я отлаживаю информацию:

User {#285 ▼
  +token: "XXX"
  +id: "XXX"
  +nickname: null
  +name: "XXX"
  +email: "XXX"
  +avatar: "XXX"
  +"user": array:4 [▶]
}

Поэтому я хотел расширить эту информацию с помощью «public-profile-url», это поле базового профиля от Linkedin.

Я пытался сделать что-то подобное в "myproject/vendor/socialiteproviders/linkedin/src/Provider.php":

/**
 * {@inheritdoc}
 */
protected function mapUserToObject(array $user)
{
   return (new User())->setRaw($user)->map([
       'id' => $user['id'], 'nickname' => null,
       'name' => $user['formattedName'], 'email' => $user['emailAddress'],
       'avatar' => array_get($user, 'pictureUrl'),
       'link' => array_get($user, 'publicProfileUrl'),
   ]);
}

Но тогда ссылка будет "нулевой".

Кто-нибудь знает, как решить эту проблему?


person Dees Oomens    schedule 22.05.2015    source источник


Ответы (1)


В настоящее время я исправил проблему.

В myproject/vendor/socialiteproviders/linkedin/src/Provider.php я добавил поле «public-profile-url» к URL-адресу:

/**
 * {@inheritdoc}
 */
protected function getUserByToken($token)
{
    $response = $this->getHttpClient()->get(
       'https://api.linkedin.com/v1/people/~:(id,formatted-name,picture-url,email-address,public-profile-url)', [
        'headers' => [
            'Accept-Language' => 'en-US',
            'x-li-format'     => 'json',
            'Authorization'   => 'Bearer '.$token,
        ],
    ]);

    return json_decode($response->getBody(), true);
}

Когда вы делаете это, вы можете получить доступ к полю «publicProfileUrl» в пользовательском массиве, например:

/**
 * {@inheritdoc}
 */
protected function mapUserToObject(array $user)
{
    return (new User())->setRaw($user)->map([
        'id' => $user['id'], 'nickname' => null,
        'name' => $user['formattedName'], 'email' => $user['emailAddress'],
        'avatar' => array_get($user, 'pictureUrl'),
        'profileUrl' => array_get($user, 'publicProfileUrl'),
    ]);
}

Надеюсь, кто-то найдет это полезным.

Уведомление
Это находится в каталоге поставщиков! Этот код можно выбросить всякий раз, когда вы выполняете (композиторское) обновление своего проекта.

person Dees Oomens    schedule 22.05.2015
comment
Я следовал вашему решению, но не хотел терять свои изменения при каждом composer update. Поэтому я скопировал папку socialiteproviders в папку верхнего уровня packages, которую я использую для своих собственных (некомпозиторских) пакетов. Затем просто удалите его из блока require в composer.json и добавьте два маршрута в autoload/psr-4 вот так: "SocialiteProviders\\LinkedIn\\": "packages/socialiteproviders/linkedin/src", и "SocialiteProviders\\Manager\\": "packages/socialiteproviders/manager/src". Теперь запустите обновление композитора, и все должно работать нормально. - person Fixspec; 01.06.2015