2016-07-01 51 views
1

的實例我想換掉我的客戶調用或更好地嘗試圍繞this package做一個包裝,所以我不必每次都寫這個,所以我做了一個新的ServiceProvider,應該叫我Laravel自己的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(); 
    } 
} 

測試

我只是把它在我的routes.php文件來測試

use Chris\Swapi\Swapi; 

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

,但我得到每次錯誤

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

,所以我問爲什麼這個

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

不叫,每次我打電話的方法e.g $shopware->getArticleQuery()->findAll(); 有誰知道爲什麼嗎?

+0

構造函數**被**調用 - 與您的錯誤無關。 **方法**'fetchAllArticles'需要一個'Shopware'的實例作爲參數傳遞,你不這樣做:'return Swapi :: fetchAllArticles(); // < - - 沒有args通過' – Steve

+0

這就是問題,我不需要傳遞任何參數。如果你看看實際的軟件包,客戶似乎不會被調用:https://github.com/LeadCommerceDE/shopware-sdk 那麼我現在該怎麼做? :) – bobbybackblech

回答

1

我想這裏可能會有些混淆關於Laravel的IoC。當你使用return Swapi::fetchAllArticles();時,Laravel不知道你在做什麼,因爲你沒有使用容器來構建類(即使你已經在容器中註冊了一個類),也沒有建立一個外觀來訪問它那種方式。否則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實際上只是一個關鍵的容器將用來查找實際的類。當你可以保持簡單和容易時,不需要傳入整個合格的課程名稱。

我的SwapiRepository這真的是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(); 
    } 
} 

在這一點上,你基本上完成了。就在app/config.php添加App\Providers\SwapiServiceProvider::class,providers陣列(你可能已經完成)並使用您的包裝,像這樣......

$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

太棒了!非常感謝。最後一個問題:如果我使用Facade,PHPStorm不會識別存儲庫的方法,因爲它似乎應該在Swapi.php類中。我將如何去解決這個問題,因爲這些方法在存儲庫中,而不是在Swapi.php類中。再次感謝您的幫助。 是否有可能有一個獨立的SwapiFacade.php?但是,我將如何「加載」這個門面? – bobbybackblech

+0

使用https://github.com/barryvdh/laravel-ide-helper,PHPStorm將開始識別外牆。 – user3158900

相關問題