【发布时间】:2016-05-04 20:32:26
【问题描述】:
我正在开发自己的 L5 包来处理付款。为了将来能够更改支付网关,我正在使用接口。
我的界面是这样的:
interface BillerInterface
{
public function payCash();
public function payCreditCard();
}
我还有一个具体的实现,就是想要的支付网关。
class Paypal implements BillerInterface
{
public function payCash()
{
// Logic
}
public function payCreditCard()
{
// Logic
}
}
Biller类是主类,构造方法期望上面的接口,像这样:
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 类时出现错误...
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实例? -
我正在我的路由文件中进行测试,基本上是尝试“新 Biller”并转储以查看其内容。
-
是的,那行不通。只有在注入
Biller以便由服务容器解析时,依赖项才会被注入,即public function __construct(Biller $biller)。 -
或使用
$biller = App::make('Biller') -
马丁,你的解决方案奏效了。我没有关注 IoC 容器上的依赖解析功能。在将类注入构造函数方法之后,我尝试在控制器中使用我的 Biller 类并且它正在工作。如何将您的答案设置为解决方案? =)