php-Laravel / Socialite:クラスLaravelSocialiteContractsFactoryは存在しません
socialiteを実装しようとしていますが、Factoryクラスに関連するエラーが発生します。私のアプリはそれを見つけることができません。
これは私のコントローラーのコードです:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use Laravel\Socialite\Contracts\Factory as Socialite;
class PortalController extends Controller
{
public function __construct(Socialite $socialite){
$this->socialite = $socialite;
}
public function getSocialAuth($provider=null)
{
if(!config("services.$provider")) abort('404'); //just to handle providers that doesn't exist
return $this->socialite->with($provider)->redirect();
}
public function getSocialAuthCallback($provider=null)
{
if($user = $this->socialite->with($provider)->user()){
dd($user);
}else{
return 'something went wrong';
}
}
追加しました:
Laravel\Socialite\SocialiteServiceProvider::class,
からプロバイダーおよび
'Socialite' => Laravel\Socialite\Facades\Socialite::class
からエイリアスへ
そして私のルートは次のようになります
Route::get('/portal/{provider?}',[
'uses' => '[email protected]',
'as' => 'portal.getSocialAuth'
]);
Route::get('/portal/callback/{provider?}',[
'uses' => '[email protected]',
'as' => 'portal.getSocialAuthCallback'
]);
私が受け取るエラーは次のとおりです:
Container.php行798のReflectionException: クラスLaravel\Socialite \ Contracts\Factoryは存在しません
答え :
解決策:
カスタムoAuthプロバイダーの作成中にLaravel 5.5
でもこの問題が発生しました。長い調査の結果、カスタムの MySocialServiceProvider
クラスを作成して達成しました。Laravel\Socialite\SocialiteServiceProvider
で拡張する必要があります。次のすべてのコードを実行し、適切な構成でセットアップしてください。確実に機能します。
MySocialServiceProvider .php
<?php
名前空間App\Providers;
Laravel\Socialite\SocialiteServiceProviderを使用します;
クラスMySocialServiceProviderはSocialiteServiceProviderを拡張します
{{
パブリック関数レジスタ()
{{
$ this-> app-> bind('Laravel \ Socialite \ Contracts \ Factory'、function($ app){
新しいMySocialManager($ app);を返します。
});
}
}
次の内容を含むMangerクラスを作成する必要があります
MySocialManager.php
<?php
namespace App\Providers;
use App\Auth\SocialiteFooDriver;
use Laravel\Socialite\SocialiteManager;
class MySocialManager extends SocialiteManager
{
protected function createFooDriver()
{
$config = $this->app['config']['services.foo'];
return $this->buildProvider(
SocialiteFooDriver::class, $config
);
}
}
MySocialManger
SocialiteFooDriver.php
<?php
namespace App\Auth;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User;
class SocialiteFooDriver extends AbstractProvider implements ProviderInterface
{
/**
* Foo API endpoint.
*
* @var string
*/
// protected $apiUrl = 'https://auth.foobar.com';
protected $apiUrl = '';
public function __construct(Request $request, $clientId, $clientSecret, $redirectUrl)
{
parent::__construct($request, $clientId, $clientSecret, $redirectUrl);
$this->apiUrl = config('services.foo.url');
}
/**
* The scopes being requested.
*
* @var array
*/
protected $scopes = ['openid email profile user_role user_full_name'];
/**
* {@inheritdoc}
*/
protected function getAuthUrl($state)
{
return $this->buildAuthUrlFromBase($this->apiUrl.'/oauth2/authorize', $state);
}
/**
* {@inheritdoc}
*/
protected function getTokenUrl()
{
return $this->apiUrl.'/oauth2/token';
}
/**
* {@inheritdoc}
*/
protected function getUserByToken($token)
{
$userUrl = $this->apiUrl.'/oauth2/UserInfo?access_token='.$token;
$response = $this->getHttpClient()->get(
$userUrl, $this->getRequestOptions()
);
$user = json_decode($response->getBody(), true);
if (in_array('user:email', $this->scopes)) {
$user['email'] = $this->getEmailByToken($token);
}
return $user;
}
/**
* Get the POST fields for the token request.
*
* @param string $code
*
* @return array
*/
protected function getTokenFields($code)
{
return array_add(
parent::getTokenFields($code), 'grant_type', 'authorization_code'
);
}
/**
* {@inheritdoc}
*/
protected function mapUserToObject(array $user)
{
return (new User())->setRaw($user)->map([
'id' => $user['sub'],
'nickname' => $user['preferred_username'],
'name' => Arr::get($user, 'name'),
'email' => Arr::get($user, 'email'),
'avatar' => $user['avatar'],
]);
}
/**
* Get the default options for an HTTP request.
*
* @return array
*/
protected function getRequestOptions()
{
return [
'headers' => [
//'Accept' => 'application/vnd.github.v3+json',
],
];
}
}
最後に、config/services.phpに構成値を追加する必要があります
'foo' => [
'client_id' => 'XXXXXXXX',
'client_secret' => 'YYYYYYYY',
'redirect' => 'http://example.com/login/foo/callback/',
'url' => 'https://auth.foobar.com',
],
新しいプロバイダーでconfig/app.phpを更新することを忘れないでください
'プロバイダー'=>[
//..。
\ App \ Providers \ MySocialServiceProvider :: class
]
答え :
解決策:
doc から、 Socialite library
とfacadeを追加した後 code>を
config/app.php
ファイルのそれぞれのproviders
およびaliases
配列に追加します。 Socialiteを
use Socialite;
しかし、使用しています
use Laravel\Socialite\Contracts\Factory as Socialite;
つまり、
で上の行を削除するだけです。 use Socialite;
コメントから更新
composer update
および
composer dump-autoload
動作するはずです。
答え :
解決策:
公式インストールガイドには、これを使用する必要があると記載されています:
use Socialite;
代わりに:
use Laravel\Socialite\Contracts\Factory as Socialite;
機能しない場合は、次を使用してみてください:
use Laravel\Socialite\Facades\Socialite
次に、 composer dumpauto
を使用します。
答え :
解決策:
「composerupdate」でこの問題が修正され、「use Laravel \ Socialite \ Contracts \ FactoryasSocialite;」で動作します。
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。