[英]Laravel dependency injection / IOC
我试图集成到Xero API-我正在使用以下包装器:
https://github.com/drawmyattention/xerolaravel
我可以使用Facade方法访问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
如果这是一个愚蠢的问题,我真的很抱歉-我还没有涉足Laravel的这一方面。
服务提供者仅用于为IOC设置所有绑定和所有内容。 如前所述,将其添加到config/app.php
中,然后您就不再担心它了。 这不是您应该注入的类。
不幸的是,在查看代码时,此程序包无法很好地进行依赖项注入。 这是服务提供者内部绑定之一的示例:
$this->app->bind('XeroPrivate', function () use ($config) {
return new \XeroPHP\Application\PrivateApplication($config);
});
使用此绑定,这意味着您可以通过调用$private = app('XeroPrivate');
从IOC解析新的PrivateApplication
实例$private = app('XeroPrivate');
。 但是,由于PrivateApplication
需要特殊的构造(在构造函数中传递的配置),因此此设置无法帮助您进行依赖项注入。
绑定是为XeroPrivate
设置的,但是,该类不存在,这意味着您不能键入提示将其注入。 您可能在config/app.php
文件中添加了XeroPrivate
作为别名,这将绕过XeroPrivate
类不存在的问题,但这意味着注入了Facade类(别名指向的是),而不是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
实例,并将使用上面创建的绑定将这个实例从IOC中解析出来(这又将XeroPublic
对象从IOC中解析出来) 。 它将对XeroPHP\\Application\\PublicApplication
和XeroPHP\\Application\\PartnerApplication
执行相同的XeroPHP\\Application\\PublicApplication
。
其余的类不需要任何特殊的构造,因此无需为其创建自定义绑定。 可以按原样注入它们:
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
了一个新实例并将其注入。 对于上面显示的其余类,它将执行相同的操作。
使用您分配的别名:
use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider as Xero;
class Foo {
private $xero;
public function __construct(Xero $xero)
{
$this->xero = $xero;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.