在类上注入接口(Laravel包)

时间:2016-05-04 20:32:27

标签: laravel laravel-5

我正在开发自己的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));
    });
}

任何线索?

4 个答案:

答案 0 :(得分:2)

您将接口绑定到服务提供商中的实施方案。但依赖关系只能由服务容器解决,即

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

Laravel的服务容器将读取构造函数方法的参数的类型提示,并解析该实例(以及它的任何依赖项)。

您将无法直接“新建”Billing实例(即$billing = new Billing),因为构造函数期望实现BillingInterface的某些内容,而您未提供此内容。

答案 1 :(得分:0)

当您将接口绑定到实际类时尝试使用字符串'\ Your \ Namespace \ BillerInterface'替换BillerInterface::class

答案 2 :(得分:0)

这就是我在我的应用中完成它的方式,它似乎正在运作:

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

答案 3 :(得分:0)

谈论@MaGnetas答案

我更喜欢使用这种方式将类与接口绑定。

public function register()
{
    $this->app->bind(AppointmentInterface::class, AppointmentService::class);
}

这可以帮助IDE查找类的路径,我们只需单击它就可以跳到该类。

如果我们将类路径作为字符串路径传递,如下所示:

public function register()
{
    $this->app->bind('App\Interfaces\AppointmentInterface', 'App\Services\AppointmentService');
}

然后,当我们单击该字符串时,IDE找不到类的位置。