client = new \GuzzleHttp\Client([ 'base_uri' => config("bim.black_hole.host"), 'http_errors' => false, 'debug' => false, 'headers' => [ 'Accept' => "application/json", 'ClientId' => config("bim.black_hole.client_id"), 'SecretKey' => config("bim.black_hole.secret_key"), 'UserId' => config("bim.black_hole.user_id"), ] ]); } public static function getInstance(): Client { if (! self::$instance) { self::$instance = new self(); } return self::$instance; } public function request(string $method, string $uri, array $options = []): ?array { return $this->parseResponse($this->client->request($method, $uri, $options)); } public function post(string $uri, array $options = []) { return $this->request("POST", $uri, $options); } protected function parseResponse(ResponseInterface $response): ?array { $body = json_decode((string)$response->getBody(), true); return match ($response->getStatusCode()) { 200, 201, 204 => $this->parseStatusSuccessResponse($body), default => throw new FailedException($body['message'] ?? $response->getReasonPhrase()), }; } protected function parseStatusSuccessResponse(array $body) { $isJson = json_last_error() == JSON_ERROR_NONE; if (! $isJson) { return []; } if (! $body['isSuccess']) { throw new FailedException($body['errMsg']); } return $body; } }