2016-03-23 5 views
2

Я пытаюсь реализовать socialite, но я получаю сообщение об ошибке, относящемся к классу Factory. Мое приложение не может найти его.Laravel/Socialite: Class Laravel Socialite Contracts 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' 
    ]); 

Ошибка я получаю это:

ReflectionException в Container.php линии 798: Класс Laravel \ Светская \ Контракты \ Factory не существует

ответ

0

От doc, после добавления Socialite library и facade к соответствующему providers и aliases массив в config/app.php файле, вам просто нужно использовать Socialite в

use Socialite; 

Но вы используете

use Laravel\Socialite\Contracts\Factory as Socialite; 

Таким образом, просто удалить выше линии с

use Socialite; 

обновляемой от комментариев

composer update 

и

composer dump-autoload 

Он должен работать.

+0

теперь я получаю «Класс Светская не существует» –

+0

вы сделали 'композитор дамп-autoload' ?? – Drudge

+0

Да, я сделал, но все еще не работает –

0

Official installation guide говорит, что вы должны использовать это:

use Socialite; 

Вместо:

use Laravel\Socialite\Contracts\Factory as Socialite; 

Если это не работает, попробуйте использовать:

use Laravel\Socialite\Facades\Socialite 

И затем использовать composer dumpauto.

+0

теперь я получаю «Class Socialite не существует» –

+0

Попробуйте использовать 'composer dumpauto'. Если это не сработает, попробуйте использовать 'use Laravel \ Socialite \ Facades \ Socialite;' –

+0

Я пробовал оба из них, не работает –

0

«Обновление для композитора» исправил этот вопрос для меня, и он работает с: «использовать Laravel \ Socialite \ Contracts \ Factory as Socialite»;

2

Я также столкнулся с этой проблемой в Laravel 5.5при создании пользовательского поставщика oAuth. После долгого исследования я достиг, создав пользовательский класс 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', 
      ], 
     ]; 
    } 
} 

Наконец, мы должны добавить значения конфигурации в конфигурации/services.php

'foo' => [ 
     'client_id' => 'XXXXXXXX', 
     'client_secret' => 'YYYYYYYY', 
     'redirect' => 'http://example.com/login/foo/callback/', 
     'url' => 'https://auth.foobar.com', 
    ], 

Не забудьте обновить конфигурацию/app.php с нашим новым поставщиком

'providers' => [ 
//... 

\App\Providers\MySocialServiceProvider::class 

] 
+0

Удивительный вы спасли мой день – gyaan