Php Laravel自己的ServiceProvider客户端调用类型错误:参数1传递给。。。必须是一个实例
我想换掉我的客户机呼叫,或者更好,我试着做一个包装,这样我就不必每次都写这个,所以我做了一个新的服务提供商,应该调用它Php Laravel自己的ServiceProvider客户端调用类型错误:参数1传递给。。。必须是一个实例,php,laravel,Php,Laravel,我想换掉我的客户机呼叫,或者更好,我试着做一个包装,这样我就不必每次都写这个,所以我做了一个新的服务提供商,应该调用它 // Create a new client, // so i dont have to type this in every Method $client = new ShopwareClient('url', 'user', 'api_key'); 在我提出的每一个要求上 // Later after the Client is called i can make a
// Create a new client,
// so i dont have to type this in every Method
$client = new ShopwareClient('url', 'user', 'api_key');
在我提出的每一个要求上
// Later after the Client is called i can make a Request
return $client->getArticleQuery()->findAll();
SwapiServiceProvider
<?php
namespace Chris\Swapi;
use Illuminate\Support\ServiceProvider;
use LeadCommerce\Shopware\SDK\ShopwareClient;
class SwapiServiceProvider extends ServiceProvider
{
/**
* Perform post-registration booting of services.
*
* @return void
*/
public function boot()
{
}
/**
* Register any package services.
*
* @return void
*/
public function register()
{
$this->app->singleton(ShopwareClient::class, function () {
return new ShopwareClient(
env('SHOPWARE_URL'),
env('SHOPWARE_USER'),
env('SHOPWARE_KEY')
);
});
}
}
测试
我只是在routes.php中调用它进行测试
use Chris\Swapi\Swapi;
Route::get('swapi', function () {
// Since this is a package i also made the Facade
return Swapi::fetchAllArticles();
});
但每次我都会犯错误
Swapi.php第18行中的FatalThroTableError:类型错误:参数1
传递给Chris\Swapi\Swapi::fetchAllArticles()的必须是
LeadCommerce\Shopware\SDK\ShopwareClient,未给定,已调用
/第7行的Users/chris/Desktop/code/swapi/app/Http/routes.php
所以我问为什么会这样
return new ShopwareClient(
env('SHOPWARE_URL'),
env('SHOPWARE_USER'),
env('SHOPWARE_KEY')
);
不是每次调用方法时都调用,例如$shopware->getArticleQuery()->findAll()代码>
有人知道为什么吗?我想这里可能对拉雷维尔的国际奥委会有些困惑。使用返回Swapi::fetchAllArticles()时代码>,Laravel不知道您在做什么,因为您没有使用容器来构建Swapi
类(即使您已经向容器注册了一个),也没有构建门面来以这种方式访问它。否则PHP会抱怨,因为你的函数不是静态的
我只是写了这段代码,并验证了它的工作,因为拉雷维尔把这一切放在一起
在我的服务提供商中,我的注册功能是
public function register()
{
$this->app->singleton('swapi', function($app) {
return new SwapiRepository(
new ShopwareClient(
env('SHOPWARE_URL'),
env('SHOPWARE_USER'),
env('SHOPWARE_KEY')
)
);
});
}
请记住,swapi
实际上只是容器用来查找实际类的一个键。如果可以保持简单易用,则无需传递整个限定类名
我的SwapiRepository
实际上是Shopware SDK的包装器
use LeadCommerce\Shopware\SDK\ShopwareClient;
class SwapiRepository
{
protected $client;
public function __construct(ShopwareClient $client)
{
$this->client = $client;
}
public function fetchAllArticles()
{
return $this->client->getArticleQuery()->findAll();
}
}
在这一点上,您基本上完成了。只需在App/config.php中的Providers
数组中添加App\Providers\SwapiServiceProvider::class,
,然后像这样使用包装器
$swapi = app('swapi');
$swapi->fetchAllArticles();
Swapi::fetchAllArticles();
或者,只要Laravel正在构建所述类,您就可以让Laravel将其注入到其他类中
如果你想为它构建一个门面,在每次你想使用它或为snytactical sugar时为自己节省一行代码
use Illuminate\Support\Facades\Facade;
class Swapi extends Facade
{
protected static function getFacadeAccessor() { return 'swapi'; }
}
确保更新app/config.php
中的别名数组,使其包含'Swapi'=>app\Repositories\Swapi::class,
最后,你应该能够像这样使用它
$swapi = app('swapi');
$swapi->fetchAllArticles();
Swapi::fetchAllArticles();
请注意,您的名称空间与我的不同,因此您可能需要将我的名称空间替换为您的名称空间。您现在还应该能够轻松地将Swapi
注入到其他类中,甚至可以在需要时将方法注入到控制器中
不过要记住,如果这样做,请确保使用app()
函数从Laravel的服务容器中获取这些类的实例。如果您试图使用newsomeclass
自己构建它们,那么您有责任自己注入任何依赖项。调用构造函数-这与您的错误无关。方法fetchAllArticles
要求将Shopware
的实例作为参数传递,但不能这样做:return Swapi::fetchAllArticles()//这就是问题所在,我不需要传递任何论点。如果查看实际的软件包,客户机似乎不会被调用:那么我现在应该做什么呢?:)令人惊叹的!非常感谢你。最后一个问题:如果我使用Facade,PHPStorm不会识别存储库的方法,因为它似乎应该在Swapi.php类中。既然方法在存储库中,而不是在Swapi.php类中,我该怎么做呢。再次感谢你的帮助。是否可以有一个独立的swapiacade.php?但是我如何“加载”这个外观呢?使用和PHPStorm将开始识别这些外观。