传递给__construct()的参数1必须是GuzzleHttp \ Client

时间:2018-07-06 12:01:18

标签: php laravel

我正在尝试“使用”供应商脚本连接到Feefo api(在线评论服务),但是当我尝试使用该脚本时,会出现此错误:

Type error: Argument 1 passed to 
BlueBayTravel\Feefo\Feefo::__construct() must be an instance of 
GuzzleHttp\Client, null given, called in/Users/webuser1/Projects/_websites/domain.co.uk/plugins/gavinfoster/feefo/components/Feedback.php on line 47

这是我正在使用的供应商代码:

/*
 * This file is part of Feefo.
 *
 * (c) Blue Bay Travel <developers@bluebaytravel.co.uk>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace BlueBayTravel\Feefo;

use ArrayAccess;
use Countable;
use Exception;
use GuzzleHttp\Client;
use Illuminate\Contracts\Config\Repository;
use Illuminate\Contracts\Support\Arrayable;
use SimpleXMLElement;

/**
 * This is the feefo class.
 *
 * @author James Brooks <james@bluebaytravel.co.uk>
 */
class Feefo implements Arrayable, ArrayAccess, Countable
{
    /**
     * The guzzle client.
     *
     * @var \GuzzleHttp\Client
     */
    protected $client;

    /**
     * The config repository.
     *
     * @var \Illuminate\Contracts\Config\Repository
     */
    protected $config;

    /**
     * The review items.
     *
     * @var array
     */
    protected $data;

    /**
     * Create a new feefo instance.
     *
     * @param \GuzzleHttp\Client                      $client
     * @param \Illuminate\Contracts\Config\Repository $config
     *
     * @return void
     */
    public function __construct(Client $client, Repository $config)
    {
        $this->client = $client;
        $this->config = $config;
    }

    /**
     * Fetch feedback.
     *
     * @param array|null $params
     *
     * @return \BlueBayTravel\Feefo\Feefo
     */
    public function fetch($params = null)
    {
        if ($params === null) {
            $params['json'] = true;
            $params['mode'] = 'both';
        }

        $params['logon'] = $this->config->get('feefo.logon');
        $params['password'] = $this->config->get('feefo.password');

        try {
            $body = $this->client->get($this->getRequestUrl($params));

            return $this->parse((string) $body->getBody());
        } catch (Exception $e) {
            throw $e; // Re-throw the exception
        }
    }

    /**
     * Parses the response.
     *
     * @param string $data
     *
     * @return \Illuminate\Support\Collection
     */
    protected function parse($data)
    {
        $xml = new SimpleXMLElement($data);

        foreach ((array) $xml as $items) {
            if (isset($items->TOTALRESPONSES)) {
                continue;
            }

            foreach ($items as $item) {
                $this->data[] = new FeefoItem((array) $item);
            }
        }

        return $this;
    }

    /**
     * Assigns a value to the specified offset.
     *
     * @param mixed $offset
     * @param mixed $value
     *
     * @return void
     */
    public function offsetSet($offset, $value)
    {
        if (is_null($offset)) {
            $this->data[] = $value;
        } else {
            $this->data[$offset] = $value;
        }
    }

    /**
     * Whether or not an offset exists.
     *
     * @param mixed $offset
     *
     * @return bool
     */
    public function offsetExists($offset)
    {
        return isset($this->data[$offset]);
    }

    /**
     * Unsets an offset.
     *
     * @param mixed $offset
     *
     * @return void
     */
    public function offsetUnset($offset)
    {
        if ($this->offsetExists($offset)) {
            unset($this->data[$offset]);
        }
    }

    /**
     * Returns the value at specified offset.
     *
     * @param mixed $offset
     *
     * @return mixed
     */
    public function offsetGet($offset)
    {
        return $this->offsetExists($offset) ? $this->data[$offset] : null;
    }

    /**
     * Count the number of items in the dataset.
     *
     * @return int
     */
    public function count()
    {
        return count($this->data);
    }

    /**
     * Get the instance as an array.
     *
     * @return array
     */
    public function toArray()
    {
        return $this->data;
    }

    /**
     * Returns the Feefo API endpoint.
     *
     * @param array $params
     *
     * @return string
     */
    protected function getRequestUrl(array $params)
    {
        $query = http_build_query($params);

        return sprintf('%s?%s', $this->config->get('feefo.baseuri'), $query);
    }
}

这是我用来尝试使用供应商类中的fetch()方法的代码:

use Cms\Classes\ComponentBase;
use ArrayAccess;
use Countable;
use Exception;
use GuzzleHttp\Client;
use Illuminate\Contracts\Config\Repository;
use Illuminate\Contracts\Support\Arrayable;
use SimpleXMLElement;
use BlueBayTravel\Feefo\Feefo;

class Feedback extends ComponentBase
{

    public $client;

    public $config;

    /**
     * Container used for display
     * @var BlueBayTravel\Feefo
     */
    public $feedback;

    public function componentDetails()
    {
        return [
            'name'        => 'Feedback Component',
            'description' => 'Adds Feefo feedback to the website'
        ];
    }

    public function defineProperties()
    {
        return [];
    }

    public function onRun()
    {
        $this->feedback = $this->page['feedback'] = $this->loadFeedback($this->client, $this->config);   
    }

    public function loadFeedback($client, $config)
    {

        $feefo = new Feefo($client, $config);
        $feedback = $feefo->fetch();

        return $feedback;

    }

}

不允许我静态地调用Fetch()方法,因此尝试实例化然后使用:

    public function loadFeedback($client, $config)
    {

        $feefo = new Feefo($client, $config);
        $feedback = $feefo->fetch();

        return $feedback;

    }

我也尝试过这样的类型来提示args:

    public function loadFeedback(Client $client, Repository $config)
    {

        $feefo = new Feefo($client, $config);
        $feedback = $feefo->fetch();

        return $feedback;

    }

但是仍然出现上面的异常错误。我正在努力了解如何克服这个问题。对新手的任何帮助都非常感激:)

1 个答案:

答案 0 :(得分:0)

仅提示功能的类型不会将其强制转换为该对象类型。您需要正确地将Guzzle \ Client对象传递给函数调用。

// Make sure you 'use' the GuzzleClient on top of the class 
// or use the Fully Qualified Class Name of the Client
$client = new Client(); 

$feedback = new Feedback();

// Now we passed the Client object to the function of the feedback class 
// which will lead to the constructor of the Feefo class which is 
// where your error is coming from.
$loadedFeedback = $feedback->loadFeedback($client);

别忘了对Laravel / Lumen的Repository $config做同样的事情