Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel自己的ServiceProvider客户端调用类型错误:参数1传递给。。。必须是一个实例_Php_Laravel - Fatal编程技术网

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将开始识别这些外观。