PHP :使用单例设置客户端库 URL


PHP : set client base URL with singleton

所以,我想创建一个带有单例的客户端基础URL。

这是我的GuzzleClient.php它包含基本URL

<?php
use GuzzleHttp'Client;
use GuzzleHttp'Exception'RequestException;
class GuzzleClient {
    public static function getClient()
    {
        static $client = null;
        if (null === $client) 
        {
            $client = new Client([
                'base_url' => 'http://localhost:8080/task_manager/v1/',
            ]);
        }
        return $client;
    }

    private function __construct() 
    {}
}

这是我应该放置基本网址的地方

require_once 'GuzzleClient.php';
class CardTypeAPIAccessor 
{
    private $client;
    public function __construct($client) 
    {
        $this->client = $client;
    }
    public function getCardTypes() {
        $cardTypes = array();
        try 
        {
            //this is where base URL should be
            $response = $client->get('admin/card/type',
                ['headers' => ['Authorization' => $_SESSION['login']['apiKey']]
            ]);
            $statusCode = $response->getStatusCode();
            // Check that the request is successful.
            if ($statusCode == 200) 
            {
                $error = $response->json();
                foreach ($error['types'] as $type) 
                {
                    $cardType = new CardType();
                    $cardType->setId($type['card_type_id']);
                    $cardType->setCategory($type['category']);
                    array_push($cardTypes, $cardType);
                }
            }
        }
    }

}

我坚持如何将GuzzleClient中的方法放入此代码中。谢谢

我正在为发送请求的网络服务创建一个抽象类。guzzle 的实例是在单例文件中创建的:

use Guzzle'Http'Client;
class GuzzleSingleton
{
    private static $_instance = null;
    private static $baseUrl = '';
    public static function getBaseUrl(): string
    {
        return self::$baseUrl;
    }
    private static function setBaseUrl($baseUrl): void
    {
        self::$baseUrl = $baseUrl;
    }
    public static function getInstance(string $apiUrl, ?int $apiPort, string $apiSuffix): ?Client
    {
        if (is_null(self::$_instance)) {
            self::buildApiUrl($apiUrl, $apiPort, $apiSuffix);
            self::$_instance = new Client(self::getBaseUrl());
        } else {
            self::buildApiUrl($apiUrl, $apiPort, $apiSuffix);
            self::$_instance->setBaseUrl(self::getBaseUrl());
        }
        return self::$_instance;
    }
    private static function buildApiUrl(string $apiUrl, ?int $apiPort, string $apiSuffix): void
    {
        $apiDns = rtrim($apiUrl, '/');
        $urlApi = (!is_null($apiPort)) ? sprintf('%s:%d', $apiDns, $apiPort) : $apiUrl;
        $urlApi .= $apiSuffix;
        self::setBaseUrl($urlApi);
    }
}

我的抽象课:

abstract class AbstractWebservice
{
    public function __construct(string $apiUrl, ?int $apiPort, ?string $apiSuffixUrl, Session $session)
    {
        $this->setApiUrl($apiUrl);
        $this->setApiPort($apiPort);
        $this->setApiSuffixUrl($apiSuffixUrl);
        $this->session = $session;
        $this->buildFactory();
    }
    public function buildFactory(): void
    {
        $this->guzzleWs = GuzzleSingleton::getInstance($this->getApiUrl(), $this->getApiPort(), $this->getApiSuffixUrl());
    }
    public function sendRequest(string $endpoint, ?array $body, ?array $options, string $method)
    {
        $request = $this->guzzleWs->createRequest($method, $endPoint, self::$headers, $body, $options);
        return $request->send();
    }
   
}

inharit GuzzleClient类到CardTypeAPIAccessor中,并检查$client是否未instanceof GuzzleClient然后将访问对象分配给$this->client

class CardTypeAPIAccessor extends GuzzleClient
{
    private $client;
    public function __construct($client) 
    {
      if($client instanceof GuzzleClient){
          $this->client = $client              
      }else{
          $this->client = parent::getClient();
      }  

    }
}