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

]