2016-07-01 15 views
1

クライアントコールを交換したい方が良いでしょう。 、私は新しいサービスプロバイダを作りました。これは、すべてのリクエストに応じて、Laravel Own ServiceProviderクライアントのコールタイプエラー:引数1が渡されました

// Create a new client, 
// so i dont have to type this in every Method 
$client = new ShopwareClient('url', 'user', 'api_key'); 

です。

// 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') 
       ); 
     }); 
    } 
} 

私のクラス

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

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

テスト

私はちょうど

012をテストするために私routes.phpの中でそれを呼び出します
use Chris\Swapi\Swapi; 

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

しかし、私はこの

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

が毎回呼び出されない理由を私は求めています

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

毎回エラーを取得する私は、誰もがなぜ知っています例えば$shopware->getArticleQuery()->findAll(); メソッドを呼び出しますか?

+0

コンストラクタ**は**呼び出されます - あなたのエラーとは関係ありません。 **メソッド** fetchAllArticles'は、 'Shopware'のインスタンスが引数として渡されることを要求します。あなたはそれをしません:' return Swapi :: fetchAllArticles(); // < - no args passes' – Steve

+0

これは問題なので、引数を渡す必要はありません。実際のパッケージを見ていれば、クライアントは呼び出されていないようです:https://github.com/LeadCommerceDE/shopware-sdk どうすればいいですか? :) – bobbybackblech

答えて

1

私はLaravelのIoCについてここではいくつかの混乱があるかもしれないと思います。 return Swapi::fetchAllArticles();を使用すると、Laravelはコンテナを使用して、Swapiクラスを構築するためにコンテナを使用していないため(コンテナに登録しているにもかかわらず)、コンテナにアクセスするためのファサードを構築していないため、そのように。さもなければPHPはあなたの関数がstaticではないので文句を言うでしょう。

私はこのコードを書いたし、それは限りLaravelはすべて一緒にそれを置くように動作することを確認しました。私のサービスプロバイダで

、私のレジスタの機能は、このだった...

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

swapiが本当にコンテナが実際のクラスを見つけるために使用するキーだけで、覚えておいてください。シンプルで簡単なクラス名を渡す必要はありません。

本当にShopware SDKのラッパーですマイSwapiRepository

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

この時点で、基本的には完了です。ただ、app/config.phpに(あなたはおそらくすでに行っている)providers配列にApp\Providers\SwapiServiceProvider::class,を追加し、そう...

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

それとも、Laravelは限りLaravelが言ったを構築しているように、他のクラスに注入することができようにあなたのラッパーを使用クラス。

あなたは、これは自分でコードの行を保存するためにあなたがこのまたはsnytactical砂糖を使用するたびに、ファサードを増築したい場合は...

use Illuminate\Support\Facades\Facade; 

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

であなたのaliases配列を更新することを確認しますapp/config.php ...それは'Swapi' => App\Repositories\Swapi::class,

が含まれていますそして最後に、あなたがそうのようにそれを使用することができるはずよう

Swapi::fetchAllArticles(); 

あなたの名前空間は私のものとは異なるので、私とあなたのものを置き換える必要があるかもしれません。他のクラスに簡単にSwapiを注入し、必要に応じてコントローラに注入することもできます。

ただし、そうする場合は、app()機能を使用して、Laravelのサービスコンテナからクラスのインスタンスを取得していることを確認してください。 new SomeClassを使用して自分自身をビルドしようとすると、依存関係を自分で注入する責任があります。

+0

恐ろしい!どうもありがとうございます。 1つ前の質問:私がFacadeを使用している場合、PHPStormはSwapi.phpクラスにあるはずなので、リポジトリのメソッドを認識しません。メソッドがリポジトリにあり、Swapi.phpクラスではないので、私はこれについてどうやって行くのでしょうか。あなたの助けをもう一度ありがとう。 スタンドアロンのSwapiFacade.phpを使用することはできますか?しかし、どのように私はこのファサードを "ロード"しますか? – bobbybackblech

+0

https://github.com/barryvdh/laravel-ide-helperを使用すると、PHPStormはファサードの認識を開始します。 – user3158900

関連する問題