首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类注入接口(Laravel包)

类注入接口(Laravel包)
EN

Stack Overflow用户
提问于 2016-05-04 20:32:26
回答 4查看 1.1K关注 0票数 1

我正在开发自己的L5包来处理付款。为了能够在未来改变支付网关,我正在使用接口。

我的界面看起来如下:

代码语言:javascript
复制
interface BillerInterface
{
    public function payCash();

    public function payCreditCard();
}

我也有一个具体的实现,这是理想的支付网关。

代码语言:javascript
复制
class Paypal implements BillerInterface
{
    public function payCash()
    {
        // Logic
    }

    public function payCreditCard()
    {
        // Logic
    }
}

Biller类是主类,构造函数方法需要上面的接口,如下所示:

代码语言:javascript
复制
class Biller {

    protected $gateway;

    public function __construct(BillerInterface $gateway)
    {

        $this->gateway = $gateway;
    }

    // Logic

}

最后,我创建了服务提供者,将接口绑定到网关类。

代码语言:javascript
复制
public function register()
{
    $this->app->bind(BillerInterface::class, 'Vendor\Biller\Gateways\Paypal');
}

似乎在工作,但我在尝试实例化Biller类时出错了.

代码语言:javascript
复制
Biller::__construct() must be an instance of Vendor\Biller\Contracts\BillerInterface, none given

我试过下面的代码,但似乎不起作用.

代码语言:javascript
复制
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));
    });
}

有什么线索吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-05-04 21:03:09

您正在将接口绑定到服务提供程序中的实现。但依赖关系将仅由服务容器解决,即

代码语言:javascript
复制
class SomeClass
{
    public function __construct(Billing $billing)
    {
        $this->billing = $billing;
    }
}

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

您将无法直接“更新”Billing实例(即$billing = new Billing),因为构造函数期望实现BillingInterface,而您没有提供这些实现。

票数 2
EN

Stack Overflow用户

发布于 2016-05-04 20:57:10

当将接口绑定到实际类时,尝试将BillerInterface::class替换为字符串“\you\Namespace\BillerInterface”

票数 0
EN

Stack Overflow用户

发布于 2016-05-04 20:58:15

这就是我在我的应用程序中所做的事情,它似乎正在起作用:

代码语言:javascript
复制
public function register()
{
    $this->app->bind('DesiredInterface', function ($app) {
        return new DesiredImplementationClass(
            $app['em'],
            new ClassMetaData(DesiredClass::class)
        );
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37037486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档