PHP : set client base URL with singleton

标签 php 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() 
    {}
}

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

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();
    }

   
}

关于PHP : set client base URL with singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27436915/

相关文章:

php - CodeIgniter:通过 ActiveRecord 结果 ID 将 $subresult 添加到对象 $result

使用多个词的 PHP 搜索

php - Octobercms - 获取前端用户头像

php - BINARY 数据没有插入到从 BINARY(20) 列提取的 mysql 中?

java - 将 Context 作为参数传递给 Singleton 类中的方法会导致内存泄漏

spring - 如何在 Hibernate UserType 对象中注入(inject)一个 bean?

php - 尝试 INSERT....ON DUPLICATE KEY 时出现 mysql 错误

objective-c - Objective-C 和 swift

c++ - C++11 中的静态局部变量?

c# - 如何使用 XML 序列化抽象创建单例