私は自分の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));
});
}
手がかりはありますか?
あなたは 'Biller'インスタンスをインスタンス化していますか? –
私はルートファイル内で基本的に "new Biller"を試してその内容を見るためにダンプしています。 – Sergio
ええ、それは動作しません。 'Biller'を注入してサービスコンテナ、つまり' public function __construct(Biller $ biller) 'によって解決されるようにすると、依存関係は注入されます。 –