2016-03-30 175 views
0

我试图整合到Xero的API - 我用下面的包装:Laravel依赖注入/ IOC

https://github.com/drawmyattention/xerolaravel

我能够用正面的方法,但我访问API我真的很想解决这些依赖问题,并且一切正常,我仍然在学习这些东西。

我也跟着指示,补充说:

DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider::class 

要我app.php &我的控制器内,我试图解决这个(我想?)

我开始通过执行以下操作:

use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider as Xero; 
    private $xero; 


public function __construct(XeroServiceProvider $xero) 
{ 
    $this->xero = $xero; 
} 

即使是,产生错误:

BindingResolutionException in Container.php line 828: 
Unresolvable dependency resolving [Parameter #0 [ <required> $app ]] 
in class Illuminate\Support\ServiceProvider 

如果这是一个愚蠢的问题,我真的很抱歉 - 我还没有涉足拉拉维尔这边。

+0

删除'as Xero'或将您的构造函数更改为'Xero $ xero'。 – jardis

回答

1

服务提供商仅用于设置所有的绑定和一切国际奥委会。正如您所提到的那样,您将其添加到您的config/app.php中,然后您就不会再担心它了。这不是你应该注射的课程。

不幸的是,从代码的角度来看,这个包并没有很好地为依赖注入设置好自己。这是运营商内部的绑定的一个示例:

$this->app->bind('XeroPrivate', function() use ($config) { 
    return new \XeroPHP\Application\PrivateApplication($config); 
}); 

了此绑定的,这意味着你可以通过调用$private = app('XeroPrivate');解决新PrivateApplication实例出国际奥委会。但是,因为PrivateApplication需要特殊构造(配置在构造函数中传递),所以此设置不会帮助您进行依赖注入。

绑定设置为XeroPrivate,但是,该类不存在,这意味着您不能键入提示它注入它。您可能在您的config/app.php文件中添加了XeroPrivate作为别名,这将会绕过XeroPrivate类不存在的问题,但这意味着将注入外观类(这是别名指向的内容),而不是PrivateApplication类。

为了能够正确地注入PrivateApplication类,您需要设置自己的绑定。您可以创建一个新的服务提供商,或者只是添加到您的AppServiceProvider:

$this->app->bind('XeroPHP\Application\PrivateApplication', function ($app) { 
    return $app['XeroPrivate']; 
}); 

你需要做同样的事情为PublicApplicationPartnerApplication

$this->app->bind('XeroPHP\Application\PublicApplication', function ($app) { 
    return $app['XeroPublic']; 
}); 

$this->app->bind('XeroPHP\Application\PartnerApplication', function ($app) { 
    return $app['XeroPartner']; 
}); 

凭借这些绑定,就可以安全注入任何类到你的构造函数中,并且它们将被正确地解决:

use XeroPHP\Application\PrivateApplication; 
use XeroPHP\Application\PublicApplication; 
use XeroPHP\Application\PartnerApplication; 

public function __construct(PrivateApplication $xeroPrivate, PublicApplication $xeroPublic, PartnerApplication $xeroPartner) 
{ 
    $this->xeroPrivate = $xeroPrivate; 
    $this->xeroPublic = $xeroPublic; 
    $this->xeroPartner = $xeroPartner; 
} 

当控制器被实例化时,它会看到它需要一个新的XeroPHP\Application\PrivateApplication实例,并且它会使用我们上面创建的绑定(这又将XeroPublic对象从IOC中解析出来)解析出IOC。它将为XeroPHP\Application\PublicApplicationXeroPHP\Application\PartnerApplication执行相同操作。

其余的类不需要任何特殊的构造,所以不需要为它们创建自定义绑定。它们可以被注射的是:

use XeroPHP\Models\Accounting\Invoice; 
use XeroPHP\Models\Accounting\Invoice\LineItem; 
use XeroPHP\Models\Accounting\Contact; 
use XeroPHP\Models\Accounting\BrandingTheme; 
use XeroPHP\Models\Accounting\Attachment; 

public function __construct(Invoice $xeroInvoice, LineItem $xeroLineItem, Contact $xeroContact, BrandingTheme $xeroBrandingTheme, Attachment $xeroAttachment) 
{ 
    $this->xeroInvoice = $xeroInvoice; 
    $this->xeroLineItem = $xeroLineItem; 
    $this->xeroContact = $xeroContact; 
    $this->xeroBrandingTheme = $xeroBrandingTheme; 
    $this->xeroAttachment = $xeroAttachment; 
} 

当控制器实例化时,会发现它需要一个新的XeroPHP\Models\Accounting\Invoice实例,但在国际奥委会的这一类,因为有没有约束力,但它只是new s上行一新实例并注入。它对上面显示的其他类也会这样做。

+1

令人印象深刻的答案。你真的帮我弄清楚了解发生了什么事。感谢您所做的努力! – ExohJosh

0

使用您指定别名:

use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider as Xero; 

class Foo { 

    private $xero; 

    public function __construct(Xero $xero) 
    { 
     $this->xero = $xero; 
    } 

}