服务提供商仅用于设置所有的绑定和一切国际奥委会。正如您所提到的那样,您将其添加到您的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'];
});
你需要做同样的事情为PublicApplication
和PartnerApplication
:
$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\PublicApplication
和XeroPHP\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上行一新实例并注入。它对上面显示的其他类也会这样做。
删除'as Xero'或将您的构造函数更改为'Xero $ xero'。 – jardis