Laravel / Socialite:班级Laravel \ Socialite \ Contracts \ Factory不存在

时间:2016-03-23 15:41:57

标签: php laravel laravel-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' => 'PortalController@getSocialAuth',
        'as'   => 'portal.getSocialAuth'
    ]);


    Route::get('/portal/callback/{provider?}',[
        'uses' => 'PortalController@getSocialAuthCallback',
        'as'   => 'portal.getSocialAuthCallback'
    ]);

我收到的错误是:

Container.php第798行中的ReflectionException: Laravel \ Socialite \ Contracts \ Factory类不存在

4 个答案:

答案 0 :(得分:3)

在创建自定义oAuth提供程序时,我在Laravel 5.5 中也遇到了此问题。经过长时间的研究,我通过创建自定义MySocialServiceProvider类来实现,需要延长Laravel\Socialite\SocialiteServiceProvider。请使用适当的配置完成以下所有代码和设置,肯定会有效。

我的目录结构如下图所示 enter image description here

<强> MySocialServiceProvider.php

<?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);
        });
    }
}

我们必须创建一个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

'providers' => [
//...

 \App\Providers\MySocialServiceProvider::class

]

答案 1 :(得分:0)

Socialite libraryfacade添加到providers文件中相应的aliasesconfig/app.php数组后,从doc开始,您只需要使用Socialite作为

use Socialite;

但你正在使用

use Laravel\Socialite\Contracts\Factory as Socialite;

所以,只需用

删除上面的行
use Socialite;

从评论

更新
composer update

composer dump-autoload

它应该工作。

答案 2 :(得分:0)

Official installation guide说你需要使用它:

use Socialite;

而不是:

use Laravel\Socialite\Contracts\Factory as Socialite;

如果无效,请尝试使用:

use Laravel\Socialite\Facades\Socialite

然后使用composer dumpauto

答案 3 :(得分:0)

“作曲家更新”为我解决了这个问题,它适用于:“使用Laravel \ Socialite \ Contracts \ Factory作为社交名媛;”