src/Drivers/BaseCurrencyDriver.php
<?php namespace Otherguy\Currency\Drivers; use DateInterval;use DateTime;use DateTimeInterface;use Exception;use GuzzleHttp\ClientInterface;use GuzzleHttp\Exception\GuzzleException;use Otherguy\Currency\Exceptions\ApiException;use Otherguy\Currency\Helpers\DateHelper; /** * Class BaseDriver * * @package Otherguy\Currency\Drivers */abstract class BaseCurrencyDriver implements CurrencyDriverContract{ protected $apiURL = 'localhost'; protected $protocol = 'http'; protected $headers = [ 'Accept' => 'application/json', 'Content-Type' => 'application/json', ]; protected $currencies = []; protected $baseCurrency = 'USD'; protected $amount = 0.00; protected $date = null; protected $httpClient = null; protected $httpParams = []; /** * BaseDriver constructor. * * @param ClientInterface $client */ public function __construct(ClientInterface $client) { $this->httpClient = $client; } /** * @param string $baseCurrency * * @return self */ public function source(string $baseCurrency): CurrencyDriverContract { $this->baseCurrency = $baseCurrency; return $this; } /** * Alias for 'source'. * * @param string $baseCurrency * * @return CurrencyDriverContract * @see CurrencyDriverContract::source() * */ public function from(string $baseCurrency): CurrencyDriverContract { return $this->source($baseCurrency); } /** * @param string|array $symbols * * @return self */ public function currencies($symbols = []): CurrencyDriverContract { $this->currencies = (array)$symbols; return $this; } /** * Alias for 'currencies'. * * @param array $symbols * * @return CurrencyDriverContract * @see CurrencyDriverContract::currencies() * */ public function to($symbols = []): CurrencyDriverContract { return $this->currencies($symbols); } /** * @param double|integer|float $amount * * @return self */ public function amount($amount): CurrencyDriverContract { $this->amount = $amount; return $this; } /** * @param int|string|DateTime|DateInterval|DateTimeInterface $date * * @return self * * @throws Exception */ public function date($date): CurrencyDriverContract { if ($date === null) { return $this; } $this->date = DateHelper::format($date, 'Y-m-d'); return $this; } /** * Returns the date in 'YYYY-mm-dd' format or null if not set. * * @return string|null */ public function getDate(): ?string { return $this->date; } /** * @return array */ public function getSymbols(): array { return $this->currencies; } /** * @return string */ public function getBaseCurrency(): string { return $this->baseCurrency; } /** * @return self */ public function secure(): CurrencyDriverContract { $this->protocol = 'https'; return $this; } /** * @return string */ public function getProtocol(): string { return $this->protocol; } /** * Set a config parameter. * * @param string $key * @param string $value * * @return self */ public function config(string $key, string $value): CurrencyDriverContract { $this->httpParams[$key] = $value; return $this; } /** * Sets the API key to use. * * Shortcut for config('access_key', $accessKey) * * @param string $accessKey Your API key. * * @return self * @see CurrencyDriverContract::config() * */ public function accessKey(string $accessKey): CurrencyDriverContract { $this->config('access_key', $accessKey); return $this; } /** * Performs an HTTP request. * * @param string $endpoint The API endpoint. * @param array $params The query parameters for this request. * @param string $method The HTTP method (defaults to 'GET'). * * @return array|bool The response as decoded JSON. * * @throws ApiException */ function apiRequest(string $endpoint, array $params = [], string $method = 'GET') { $url = sprintf('%s://%s/%s', $this->getProtocol(), $this->apiURL, $endpoint); try { $response = $this->httpClient->request($method, $url, ['query' => array_merge($this->httpParams, $params)])->getBody(); } catch (GuzzleException $e) { throw new ApiException($e->getMessage(), $e->getCode(), $e); } $data = json_decode($response->getContents(), true); // Check for JSON errors if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) { throw new ApiException(json_last_error_msg(), json_last_error()); } // Otherwise return data. return $data; }}