2016-03-23 13 views
2

Ich versuche Socialite zu implementieren, aber ich bekomme einen Fehler in Bezug auf die Factory-Klasse. Meine App kann es nicht finden. Laravel/Private: Class Laravel Socialite Contracts Factory existiert nicht

Dies ist der Code in meinem 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'; 
     } 
    } 

ich hinzugefügt:

Laravel\Socialite\SocialiteServiceProvider::class, Anbieter und

'Socialite' => Laravel\Socialite\Facades\Socialite::class zu Aliase

und meine Routen sieht aus wie

Route::get('/portal/{provider?}',[ 
     'uses' => '[email protected]', 
     'as' => 'portal.getSocialAuth' 
    ]); 


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

Der Fehler, den ich erhalten ist:

Reflection in Container.php Linie 798: Klasse Laravel \ Socialite \ Verträge \ Fabrik nicht

Antwort

0

Vom doc nach der Zugabe von Socialite library und facade an die jeweiligen providers existieren und aliases Array in config/app.php Datei, müssen Sie nur Socialite verwenden, wie

use Socialite; 

Aber Sie verwenden

use Laravel\Socialite\Contracts\Factory as Socialite; 

So entfernen Sie einfach über die Linie mit

use Socialite; 

von Kommentar aktualisiert

composer update 

und

composer dump-autoload 

Es sollte funktionieren.

+0

jetzt bekomme ich „Klasse Socialite existiert nicht“ –

+0

hast du 'Komponist dump-autoload' ?? – Drudge

+0

ja, ich tat, aber immer noch nicht funktioniert –

0

Official installation guide sagt, Sie müssen diese verwenden:

use Socialite; 

Statt:

use Laravel\Socialite\Contracts\Factory as Socialite; 

Wenn es nicht funktioniert, versuchen Sie zu verwenden:

use Laravel\Socialite\Facades\Socialite 

Und dann composer dumpauto verwenden.

+0

Jetzt bekomme ich "Class Socialite existiert nicht" –

+0

Versuchen Sie, 'Composer Dumpauto' zu verwenden. Wenn es nicht funktioniert, versuche 'Laravel \ Socialite \ Facades \ Socialite zu verwenden;' –

+0

Ich habe beide versucht, funktioniert nicht –

0

"Composer Update" behebt dieses Problem für mich und es funktioniert mit: "Verwenden Sie Laravel \ Socialite \ Contracts \ Factory als Socialite";

2

Ich stieß auch auf dieses Problem in Laravel 5.5beim Erstellen benutzerdefinierte oAuth Provider. Nach langer Forschung erreichte ich, indem ich Gewohnheit MySocialServiceProvider Klasse kreiere, die durch Laravel\Socialite\SocialiteServiceProvider verlängert werden muss. Bitte gehen Sie durch den folgenden Code und Setup mit der entsprechenden Konfiguration, sicherlich wird es funktionieren.

Meine Verzeichnisstruktur wie folgt im Bild 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); 
     }); 
    } 
} 

Wir haben eine Manger-Klasse erstellen, die wie folgt

MySocialManager enthalten .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 
     ); 
    } 
} 

Wir sollten einen benutzerdefinierten Treiber, die SocialiteFooDriver.php von MySocialManger

verwendet erstellen

<?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', 
      ], 
     ]; 
    } 
} 

Schließlich sollten wir Config-Werte in config/services.php

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

Vergessen Sie nicht, config/app.php mit unserem neuen Anbieter

'providers' => [ 
//... 

\App\Providers\MySocialServiceProvider::class 

] 
+0

Awesome du hast meinen Tag gerettet – gyaan

Verwandte Themen