2017-04-24 81 views
0

我想擴展/覆蓋LinkedInProvider.php(在vendor \ laravel \ socialite \ src \ Two中)以在Linkedin Request中添加新字段。Laravel:覆蓋Socialite Provider以添加新字段

我已經創建一個新的LinkedInProvider.php(在app \供應商)用下面的代碼:

namespace App\Providers; 

use Illuminate\Support\Arr; 
use Illuminate\Http\Request; 
use Laravel\Socialite\Two\AbstractProvider; 
use Laravel\Socialite\Two\ProviderInterface; 
use Laravel\Socialite\Two\User; 

class LinkedInProvider extends AbstractProvider implements ProviderInterface 
{ 
/** 
* The scopes being requested. 
* 
* @var array 
*/ 
protected $scopes = ['r_basicprofile', 'r_emailaddress']; 

/** 
* The separating character for the requested scopes. 
* 
* @var string 
*/ 
protected $scopeSeparator = ' '; 

/** 
* The fields that are included in the profile. 
* 
* @var array 
*/ 
protected $fields = [ 
    'id', 'first-name', 'last-name', 'formatted-name', 
    'email-address', 'headline', 'location', 'industry', 'positions', 
    'public-profile-url', 'picture-url', 'picture-urls::(original)', 
]; 

/** 
* {@inheritdoc} 
*/ 
protected function getAuthUrl($state) 
{ 
    return $this->buildAuthUrlFromBase('https://www.linkedin.com/oauth/v2/authorization', $state); 
} 

/** 
* {@inheritdoc} 
*/ 
protected function getTokenUrl() 
{ 
    return 'https://www.linkedin.com/oauth/v2/accessToken'; 
} 

/** 
* Get the POST fields for the token request. 
* 
* @param string $code 
* @return array 
*/ 
protected function getTokenFields($code) 
{ 
    return parent::getTokenFields($code) + ['grant_type' => 'authorization_code']; 
} 

/** 
* {@inheritdoc} 
*/ 
protected function getUserByToken($token) 
{ 
    $fields = implode(',', $this->fields); 

    $url = 'https://api.linkedin.com/v1/people/~:('.$fields.')'; 

    $response = $this->getHttpClient()->get($url, [ 
     'headers' => [ 
      'x-li-format' => 'json', 
      'Authorization' => 'Bearer '.$token, 
     ], 
    ]); 

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

/** 
* {@inheritdoc} 
*/ 
protected function mapUserToObject(array $user) 
{ 
    return (new User)->setRaw($user)->map([ 
     'id' => $user['id'], 'nickname' => null, 'name' => Arr::get($user, 'formattedName'), 
     'email' => Arr::get($user, 'emailAddress'), 'avatar' => Arr::get($user, 'pictureUrl'), 
     'avatar_original' => Arr::get($user, 'pictureUrls.values.0'), 
    ]); 
} 

/** 
* Set the user fields to request from LinkedIn. 
* 
* @param array $fields 
* @return $this 
*/ 
public function fields(array $fields) 
{ 
    $this->fields = $fields; 

    return $this; 
} 

}

但現在,我已經得到了這個錯誤:

Type error: Argument 1 passed to Laravel\Socialite\Two\AbstractProvider::__construct() must be an instance of Illuminate\Http\Request, instance of Illuminate\Foundation\Application given, called in G:\laragon\www\localhost\vendor\laravel\framework\src\Illuminate\Foundation\ProviderRepository.php on line 201 

我知道我可以安裝Socialite Manager,但我只想覆蓋字段列表以添加新字段(如位置和行業)

回答

0

你不應該覆蓋/擴展整個班級。在正在創建的Laravel\Socialite\Two\User對象中,有一個$user屬性,其中包含提供程序發回的原始信息。

發出請求時,您可以設定想要LinkedIn在你的控制器方法返回的字段:

public function redirectToProvider() 
{ 
    $fields = [ 
     'id', 'first-name', 'last-name', 'formatted-name', 
     'email-address', 'headline', 'location', 'industry', 
     'public-profile-url', 'picture-url', 'picture-urls:(original)', 
     'positions', 'summary' // <-- additional fields here 
    ]; 

    return Socialite::driver('linkedin')->fields($fields)->redirect(); 
} 

你可以看到正在請求兩個附加字段,位置和總結,這是不包括在內默認。

快樂黑客!