2016-07-01 9 views
1
sein

Ich möchte meine Client-Aufruf austauschen oder besser ich versuche, einen Wrapper um this package, so dass ich dies nicht jedes Mal schreiben muss , so habe ich einen neuen ServiceProvider, derLaravel Own ServiceProvider Client Aufruf Typ Fehler: Argument 1 übergeben an ... muss eine Instanz von

auf jede Anfrage, die ich mache, anrufen sollte.

// Later after the Client is called i can make a Request 
return $client->getArticleQuery()->findAll(); 

SwapiServiceProvider

<?php 

namespace Chris\Swapi; 

use Illuminate\Support\ServiceProvider; 
use LeadCommerce\Shopware\SDK\ShopwareClient; 

class SwapiServiceProvider extends ServiceProvider 
{ 
    /** 
    * Perform post-registration booting of services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 

    } 

    /** 
    * Register any package services. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app->singleton(ShopwareClient::class, function() { 
      return new ShopwareClient(
        env('SHOPWARE_URL'), 
        env('SHOPWARE_USER'), 
        env('SHOPWARE_KEY') 
       ); 
     }); 
    } 
} 

meine Klasse

... 
use LeadCommerce\Shopware\SDK\ShopwareClient as Shopware; 

class Swapi 
{ 
    public function fetchAllArticles(Shopware $shopware) 
    { 
     return $shopware->getArticleQuery()->findAll(); 
    } 
} 

Testing

ich es nur in meinem routes.php rufen zum Testen

use Chris\Swapi\Swapi; 

Route::get('swapi', function() { 
    // Since this is a package i also made the Facade 
    return Swapi::fetchAllArticles(); 
}); 

Aber ich bekomme jedes Mal der Fehler

FatalThrowableError in Swapi.php line 18: Type error: Argument 1 passed to Chris\Swapi\Swapi::fetchAllArticles() must be an instance of LeadCommerce\Shopware\SDK\ShopwareClient, none given, called in /Users/chris/Desktop/code/swapi/app/Http/routes.php on line 7

Also frage ich, warum diese

return new ShopwareClient(
    env('SHOPWARE_URL'), 
    env('SHOPWARE_USER'), 
    env('SHOPWARE_KEY') 
); 

nicht heißt jedes Mal wenn ich eine Methode aufrufen, z $shopware->getArticleQuery()->findAll(); Wer weiß, warum?

+0

Der Konstruktor ** heißt ** - das hat nichts mit Ihrem Fehler zu tun. Die ** Methode ** 'fetchAllArticles' erfordert, dass eine Instanz von' Shopware' als Argument übergeben wird, das tun Sie nicht: 'return Swapi :: fetchAllArticles(); // <- no args passes ' – Steve

+0

Das ist das Problem, ich brauche keine Argumente zu übergeben. Der Client scheint nicht aufgerufen zu werden, wenn Sie sich das Paket anschauen: https://github.com/LeadCommerceDE/shopware-sdk Was soll ich jetzt tun? :) – bobbybackblech

Antwort

1

Ich denke, dass es hier etwas Verwirrung über Laravels IoC geben könnte. Wenn Sie return Swapi::fetchAllArticles(); verwenden, weiß Laravel nicht, was Sie tun, weil Sie den Container nicht verwendet haben, um die Klasse Swapi zu erstellen (obwohl Sie eine mit dem Container registriert haben) und keine Fassade für den Zugriff darauf erstellt wurde diese Art und Weise. Ansonsten wird sich PHP beschweren, da Ihre Funktion nicht static ist.

Ich habe gerade diesen Code geschrieben und verifiziert, dass es soweit funktioniert, dass Laravel alles zusammensetzt.

In meinem Service-Provider, meine Registerfunktion war ...

public function register() 
{ 
    $this->app->singleton('swapi', function($app) { 
     return new SwapiRepository(
      new ShopwareClient(
       env('SHOPWARE_URL'), 
       env('SHOPWARE_USER'), 
       env('SHOPWARE_KEY') 
      ) 
     ); 
    }); 
} 

Denken Sie daran, ist swapi wirklich nur ein Schlüssel der Container die eigentliche Klasse finden verwenden. Es ist nicht notwendig, den gesamten qualifizierten Klassennamen einzugeben, wenn Sie es einfach und leicht halten können.

Meine SwapiRepository das ist wirklich der Wrapper für das Shopware SDK.

use LeadCommerce\Shopware\SDK\ShopwareClient; 

class SwapiRepository 
{ 
    protected $client; 

    public function __construct(ShopwareClient $client) 
    { 
     $this->client = $client; 
    } 

    public function fetchAllArticles() 
    { 
     return $this->client->getArticleQuery()->findAll(); 
    } 
} 

An diesem Punkt sind Sie im Grunde genommen fertig. Fügen Sie einfach App\Providers\SwapiServiceProvider::class, im providers Array (die Sie wahrscheinlich bereits getan haben) in app/config.php und verwenden Sie Ihre Wrapper so wie ...

$swapi = app('swapi'); 
$swapi->fetchAllArticles(); 

Oder Sie haben Laravel es in anderen Klassen injizieren solange Laravel sagt freundliches Gebäude Klasse.

Wenn Sie eine Fassade bauen für diese selbst eine einzige Zeile Code jedes Mal speichern Sie diese oder für snytactical Zucker verwenden möchten ...

use Illuminate\Support\Facades\Facade; 

class Swapi extends Facade 
{ 
    protected static function getFacadeAccessor() { return 'swapi'; } 
} 

Stellen Sie sicher, dass aliases Array zu erhalten, app/config.php so dass es 'Swapi' => App\Repositories\Swapi::class,

enthält Und schließlich sollten Sie es zu benutzen, wie so ... in der Lage

Swapi::fetchAllArticles(); 

Bitte beachten Sie, dass Ihre Namespaces sich von meinen unterscheiden, daher müssen Sie möglicherweise meine ersetzen. Sie sollten jetzt auch in der Lage sein, Swapi in andere Klassen zu injizieren und sogar Methoden, die in Ihre Controller injiziert werden, wo nötig.

Denken Sie nur daran, wenn Sie das tun, stellen Sie sicher, dass Sie Instanzen dieser Klassen aus Laravels Service Container mit der app() Funktion greifen. Wenn Sie versuchen, sie selbst zu erstellen, indem Sie new SomeClass verwenden, sind Sie dafür verantwortlich, Abhängigkeiten selbst zu injizieren.

+0

Super! Ich danke dir sehr. Eine letzte Frage: Wenn ich die Fassade benutze, erkennt PHPStorm die Methoden des Repositories nicht, da es scheint, dass es in der Swapi.php Klasse sein sollte. Wie würde ich darüber gehen, da die Methoden im Repository und nicht in der Swapi.php-Klasse sind. Nochmals vielen Dank für Ihre Hilfe. Ist es möglich, eine eigenständige SwapiFacade.php zu haben? Aber wie würde ich diese Fassade "laden"? – bobbybackblech

+0

Verwenden Sie https://github.com/barryvdh/laravel-ide-helper und PHPStorm beginnt mit der Erkennung der Fassaden. – user3158900

Verwandte Themen