Php Laravel/Socialite:类Laravel\Socialite\Contracts\Factory不存在
我试图实现社交名流,但我得到了一个与工厂类相关的错误。我的应用程序找不到它 这是我的控制器中的代码:Php Laravel/Socialite:类Laravel\Socialite\Contracts\Factory不存在,php,laravel,laravel-socialite,Php,Laravel,Laravel Socialite,我试图实现社交名流,但我得到了一个与工厂类相关的错误。我的应用程序找不到它 这是我的控制器中的代码: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Requests; use Laravel\Socialite\Contracts\Factory as Socialite; class PortalController extends Controller {
<?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';
}
}
我收到的错误是:
Container.php第798行中的ReflectionException:
类Laravel\Socialite\Contracts\Factory不存在从中,在config/app.php文件中将Socialite库和facade添加到相应的提供者和别名数组后,只需将Socialite用作
use Socialite;
但是你正在使用
use Laravel\Socialite\Contracts\Factory as Socialite;
所以,只需使用
use Socialite;
根据评论更新
及
它应该会起作用 表示您需要使用此选项:
use Socialite;
而不是:
use Laravel\Socialite\Contracts\Factory as Socialite;
如果不起作用,请尝试使用:
use Laravel\Socialite\Facades\Socialite
然后使用composer dumpauto。composer update为我解决了这个问题,它可以使用:使用Laravel\Socialite\Contracts\Factory作为Socialite 在创建自定义oAuth提供程序时,我在Laravel5.5中也遇到了这个问题。经过长时间的研究,我通过创建自定义MySocialServiceProvider类实现了这一目标,需要通过Laravel\Socialite\SocialiteServiceProvider进行扩展。请仔细阅读下面的所有代码并使用适当的配置进行设置,它肯定会工作 我的目录结构如下图所示 MySocialServiceProvider.php 最后,我们应该在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
'providers' => [
//...
\App\Providers\MySocialServiceProvider::class
]
您是否使用composer转储自动加载?然后尝试使用Laravel\Socialist\Facades\Socialist;我也试过了,但不起作用:Laravel\Socialite\Facades\Socialite类不存在。我想您还没有安装该软件包。您的供应商文件夹中是否有Socialite文件夹?它现在可用于use Laravel\Socialite\Facades\Socialite;在我更新了composer之后。非常感谢你的帮助!尝试使用composer dumpauto。如果不起作用,请尝试使用Laravel\Socialite\Facades\Socialite;你能告诉我当你使用use Socialite时导致错误的那一行吗?它现在与use Laravel\Socialite\Facades\Socialite一起工作;在我更新了composer之后。非常感谢你的帮助!很高兴这有帮助。如果你想感谢我的时间,请选择我的答案作为最佳答案。太棒了你救了我一天
use Laravel\Socialite\Facades\Socialite
<?php
namespace App\Providers;
use Laravel\Socialite\SocialiteServiceProvider;
class MySocialServiceProvider extends SocialiteServiceProvider
{
public function register()
{
$this->app->bind('Laravel\Socialite\Contracts\Factory', function ($app) {
return new MySocialManager($app);
});
}
}
<?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
);
}
}
<?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',
],
];
}
}
'foo' => [
'client_id' => 'XXXXXXXX',
'client_secret' => 'YYYYYYYY',
'redirect' => 'http://example.com/login/foo/callback/',
'url' => 'https://auth.foobar.com',
],
'providers' => [
//...
\App\Providers\MySocialServiceProvider::class
]