createClient(); $response = $this->makeApiRequest($client, $postcode); $data = $this->getDataFromResponse($response); if (array_key_exists('error', $data)) { throw new ApiErrorException($postcode, $data['error']['message']); } if (empty($data)) { throw new NoResultsFoundException($postcode, "No results found."); } return $this->createGeoCoordinates($data); } private function createClient(): HttpClientInterface { return $this->client->withOptions([ 'headers' => ["User-Agent" => "Geocode"] ]); } private function makeApiRequest(HttpClientInterface $client, string $postcode): ResponseInterface { return $client->request( method: 'GET', url: self::API_URL, options: [ 'query' => [ 'format' => 'json', 'postalcode' => $postcode ] ] ); } private function getDataFromResponse(ResponseInterface $response): array { return $response->toArray(false); } private function createGeoCoordinates(array $data): GeoCoordinates { $lat = $this->getLatitudeFromData($data); $long = $this->getLongitudeFromData($data); return new GeoCoordinates($lat, $long); } private function getLatitudeFromData(array $data): float { return (float) $data[0]['lat']; } private function getLongitudeFromData(array $data): float { return (float) $data[0]['lon']; } }