在Laravel中创建服务提供商的正确方法

问题描述

我无法为Laravel应用程序创建服务。我希望使用此服务轻松与API通信以执行IO操作。具体来说,我的Laravel应用程序需要与InvoiceNinja通信。我正在使用invoiceninja / sdk-PHP来促进这种交流。根据{{​​3}},它的用法如下:

require __DIR__ . '/vendor/autoload.PHP';

use InvoiceNinja\Config as NinjaConfig;
use InvoiceNinja\Models\Client; // Model can be Invoice,Payment,etc

NinjaConfig::setURL('https://ninja.dev/api/v1');
NinjaConfig::setToken('Your Token');

$clients = Client::all();

上面的代码段是使用API​​提取客户端列表的示例。现在,由于我正在使用Laravel,所以我不需要每次都需要向API发送请求时都设置API URL和令牌。因此,我决定使用服务提供商。以下是我在InvoiceNinjaServiceProvider.PHP注册方法中的代码

$this->app->singleton(NinjaConfig::class,function ($app) {
    NinjaConfig::setURL(config('invoice-ninja.API_URL')); // I created a config/invoice-ninja.PHP which has these variables set
    NinjaConfig::setToken(config('invoice-ninja.API_TOKEN'));
});

然后我在config/app.PHP注册了该提供者。我认为这样在控制器中使用API​​就足够了:

use InvoiceNinja\Models\Client;

public function index(InvoiceNinjaServiceProvider $invoiceNinja)
{
    $clients = Client::all();

    dd($clients); // To test that I actually receive data
}

但是出现错误Unresolvable dependency resolving [Parameter #0 [ <required> $app ]] in class Illuminate\Support\ServiceProvider。我对服务提供商不是很精通,我希望那里的人可以指出正确的方向,以使其正常工作。

谢谢。谢谢!

解决方法

绑定单例时,您应该返回已解析的实例,该实例将作为参数注入您的API.UserAPI().readUserDetails() 方法中。
来自doc

index

请注意 $this->app->singleton('HelpSpot\API',function ($app) { return new \HelpSpot\API($app->make('HttpClient')); });

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...