服务提供者仅用于为 IOC 设置所有绑定和所有内容。正如您所提到的,您将它添加到您的config/app.php
中,然后您将不再担心它。这不是您应该注入的课程。
不幸的是,看看代码,这个包并没有很好地为依赖注入做好准备。这是服务提供者内部绑定之一的示例:
$this->app->bind('XeroPrivate', function () use ($config) {
return new \XeroPHP\Application\PrivateApplication($config);
});
使用此绑定,这意味着您可以PrivateApplication
通过调用$private = app('XeroPrivate');
. 但是,由于PrivateApplication
需要特殊的构造(在构造函数中传递配置),此设置无法帮助您进行依赖注入。
绑定是为 设置的XeroPrivate
,但是,此类不存在,这意味着您不能键入提示它来注入它。您可能XeroPrivate
在文件中添加了别名config/app.php
,这将绕过XeroPrivate
类不存在的问题,但这意味着注入外观类(这是别名指向的),而不是PrivateApplication
类。
为了能够正确注入PrivateApplication
类,您需要设置自己的绑定。您可以创建一个新的服务提供者,或者只是将其添加到您的 AppServiceProvider:
$this->app->bind('XeroPHP\Application\PrivateApplication', function ($app) {
return $app['XeroPrivate'];
});
你需要对PublicApplication
and做同样的事情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
实例,它会使用我们上面创建的绑定将这个实例从 IOC 中解析出来(这反过来又将XeroPublic
对象从 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
实例,但由于 IOC 中没有为此类绑定,它只是new
创建一个新实例并注入它。它将对上面显示的其余类执行相同的操作。