2016-05-04 11 views
0

私は自分のL5パッケージを使って支払いを処理しています。将来、支払いゲートウェイを変更できるように、私はインターフェースを使用しています。クラスのインタフェースを注入する(Laravelパッケージ)

私のインターフェースは次のようになります。

interface BillerInterface 
{ 
    public function payCash(); 

    public function payCreditCard(); 
} 

私はまた、所望の支払いゲートウェイである具体的な実装を持っています。

class Paypal implements BillerInterface 
{ 
    public function payCash() 
    { 
     // Logic 
    } 

    public function payCreditCard() 
    { 
     // Logic 
    } 
} 

ビラークラスはメインクラスであり、コンストラクタメソッドがそうように、上記インタフェースを期待:

class Biller { 

    protected $gateway; 

    public function __construct(BillerInterface $gateway) 
    { 

     $this->gateway = $gateway; 
    } 

    // Logic 

} 

最後に、私は、ゲートウェイクラスへのインタフェースをバインドするために、サービスプロバイダを作成しました。

public function register() 
{ 
    $this->app->bind(BillerInterface::class, 'Vendor\Biller\Gateways\Paypal'); 
} 

私は、次のコードを試みたが、動作していないよう動作しているようだが、ビラーのクラスをインスタンス化しようとしたとき、私はエラーを取得しています...

Biller::__construct() must be an instance of Vendor\Biller\Contracts\BillerInterface, none given 

..

public function register() 
{ 
    $this->app->bind(BillerInterface::class, 'Vendor\Biller\Gateways\Paypal'); 

    $this->app->bind(Biller::class, function ($app) { 
     return new Biller($app->make(BillerInterface::class)); 
    }); 
} 

手がかりはありますか?

+0

あなたは 'Biller'インスタンスをインスタンス化していますか? –

+0

私はルートファイル内で基本的に "new Biller"を試してその内容を見るためにダンプしています。 – Sergio

+1

ええ、それは動作しません。 'Biller'を注入してサービスコンテナ、つまり' public function __construct(Biller $ biller) 'によって解決されるようにすると、依存関係は注入されます。 –

答えて

2

サービスプロバイダの実装に適したインターフェイスにバインドしています。しかし、依存関係のみサービスコンテナによって解決される、すなわち

class SomeClass 
{ 
    public function __construct(Billing $billing) 
    { 
     $this->billing = $billing; 
    } 
} 

はLaravelのサービスコンテナは、コンストラクタメソッドのパラメータの型ヒントを読み、そのインスタンスを解決(またその依存関係のいずれか)します。

インスタンスを直接(つまり$billing = new Billing)「新規作成」することはできません。これは、コンストラクタが提供していないBillingInterfaceの実装を期待しているためです。

0

あなたが実際のクラスへのインタフェースを結合している文字列でBillerInterface::classを交換してください「\あなたの\名前空間\ BillerInterface」

0

これは、私は私のアプリでそれをやった方法ですし、それが動作しているようです。

public function register() 
{ 
    $this->app->bind('DesiredInterface', function ($app) { 
     return new DesiredImplementationClass(
      $app['em'], 
      new ClassMetaData(DesiredClass::class) 
     ); 
    }); 
} 
関連する問題