Skip to content
CAI
Software that uses CAICheck a score

geocoder-php/Geocoder

73.3

Strong · 19 September 2026

12.1k

lines of production code

PHP

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a PHP geocoding library that provides a unified interface for resolving addresses and IP addresses to geographic coordinates using a wide variety of external providers. It supports both forward and reverse geocoding through a modular architecture of immutable query objects, standardized location models, and extensible middleware plugins for caching and logging. The library also includes utilities for serializing geolocation data into standard formats and formatting addresses into human-readable strings.

How it got here

2011–2017 — PSR-18 migration and provider extraction

68 changes.

The project underwent a major architectural overhaul, migrating from legacy PHP-HTTP clients to PSR-18 standards and replacing mutable state with immutable query and address models. This period saw the extraction of numerous providers into standalone packages, the removal of deprecated services, and the introduction of a flexible plugin middleware system for caching and logging.

2018–2020 — Provider expansion and model refinement

20 changes.

This period focused on significantly expanding the library's coverage by integrating numerous new geocoding providers, including Algolia Places, Mapbox, Ipstack, Photon, Geocode Earth, Google Maps Places, Pelias, IP2Location, and Azure Maps. Concurrently, existing providers like Nominatim, Here, and Photon were enhanced with dedicated address models to expose granular, provider-specific metadata and administrative details. The work also included establishing comprehensive test suites with cached fixtures to ensure reliability across these new integrations.

Features

Add Algolia Places provider

Introduces a new Algolia Places provider for the Geocoder library, enabling forward geocoding of street addresses, cities, countries, and specific place types (such as airports, bus stops, and train stations) via the Algolia Places API. The provider supports optional authentication using an application ID and API key, allows filtering by country codes and specific place types, and requires a locale for optimal results; it does not support reverse geocoding or IP-based lookups.

src/Provider/AlgoliaPlaces · high confidence

Add Geocode Earth provider

Introduces a new Geocode Earth provider that extends the existing Pelias provider to support the Geocode Earth API (https://api.geocode.earth/). Users can now perform geocoding and reverse geocoding by instantiating the provider with a PSR-18 HTTP client and a valid API key, leveraging the underlying Pelias implementation for query execution.

src/Provider/GeocodeEarth · high confidence

Add IP2Location provider

This change introduces a new IP2Location provider for the PHP Geocoder library, allowing users to perform IP geolocation lookups using the IP2Location Web Service (WS9 package). The provider requires a valid API key and supports forward geocoding of IP addresses, while reverse geocoding is not supported. It is built on PSR-18 HTTP client standards and includes necessary configuration files for testing and distribution.

src/Provider/IP2Location · high confidence

Add IP2LocationBinary provider for local BIN database lookups

Introduces the IP2LocationBinary provider, enabling geocoding via a local IP2Location BIN database file. Users can now instantiate this provider with a path to a .BIN file (downloadable from IP2Location) to resolve IP addresses to country, region, city, latitude, longitude, and postal code. The provider requires the external IP2Location PHP library and does not support reverse geocoding.

src/Provider/IP2LocationBinary · high confidence

Add IpInfo provider for IP-based geocoding

A new IpInfo provider has been added to the library, enabling users to resolve IP addresses to geographic locations (latitude, longitude, city, region, postal code, and country code) via the ipinfo.io API. This provider supports forward geocoding for valid IP addresses but does not support reverse geocoding or street addresses.

src/Provider/IpInfo · high confidence

Add Ipstack provider for IP geocoding

The Ipstack provider is now available, allowing users to geocode IP addresses using the ipstack.com API. This new component supports forward geocoding for IPv4 and IPv6 addresses, including optional language localization for results, and extracts administrative region data (region\_name) as an admin level. It does not support reverse geocoding or street address lookups, and requires a valid API key for authentication.

src/Provider/Ipstack · high confidence

Add MapTiler geocoder provider

Introduces a new MapTiler provider for the PHP Geocoder library, enabling address geocoding and reverse geocoding via the MapTiler API. The implementation accepts a PSR-18 HTTP client and an API key, supports text-based geocoding (excluding IP addresses) and reverse geocoding, and parses MapTiler's JSON response features into standard location objects including coordinates, locality, sub-locality, and country information.

(repo-wide) · high confidence

Add Mapbox Geocoding Provider

Introduces a new Mapbox provider for the PHP Geocoder library, enabling geocoding and reverse geocoding via the Mapbox API. The implementation supports street addresses (but not IP addresses), configurable geocoding modes (mapbox.places and mapbox.places-permanent), location type filtering, bounding box queries, and fuzzy matching. It requires a Mapbox access token and relies on a PSR-18 HTTP client for network requests.

src/Provider/GraphHopper, src/Provider/Mapbox · high confidence

Add Mapbox address model with specific property accessors

Introduces the MapboxAddress class in the Mapbox provider, extending the base Address model to expose Mapbox-specific data fields. Users can now access the unique result ID, street number, street name, formatted address, neighborhood, and result type through dedicated getter and immutable setter methods, allowing for more precise handling of geocoding results from the Mapbox API.

src/Provider/Mapbox/Model · high confidence

Added promise implementations for geocoder plugin results

The plugin now includes \GeocoderFulfilledPromise\ and \GeocoderRejectedPromise\ classes that implement the \Http\\Promise\\Promise\ interface. These classes handle the asynchronous resolution of geocoding results, allowing callers to attach fulfillment and rejection callbacks via the \then\ method and retrieve the final \Collection\ or exception via \wait\.

src/Plugin/Promise · high confidence

Expanded GoogleMaps address model with granular location details

The GoogleAddress model now exposes a significantly richer set of properties derived from the Google Maps API, including subpremise, postal code suffix, formatted address, street address, intersection, and various place types (political, neighborhood, premise, natural feature, airport, park, point of interest, establishment). It also introduces support for sub-locality levels, a place ID, location type, result types, and a partial match flag, allowing users to access detailed geocoding metadata that was previously unavailable.

src/Provider/GoogleMaps/Model · high confidence

Geonames provider adds CountryInfo and extended Address models

The Geonames provider now exposes richer data structures for its results. A new CountryInfo model provides detailed country metadata including bounds, continent, capital, languages, geoname ID, ISO codes, population, area, and currency. Additionally, the GeonamesAddress model extends the standard address to include provider-specific fields such as fcode, fclName, population, geoname ID, alternate names, and ascii name, allowing users to access more granular geographic details from Geonames responses.

src/Provider/Geonames/Model · high confidence

Here provider model exposes location metadata and additional data

The Here provider now includes a dedicated \HereAddress\ model that extends the base address structure. This model adds specific fields for location identification (\locationId\, \locationType\, \locationName\) and provides mechanisms to store and retrieve arbitrary additional data (\additionalData\) and shape information (\shape\) via immutable builder methods. Users can now access these granular details from Here geocoding results instead of relying solely on the generic address components.

src/Provider/Here/Model · high confidence

Initial release of the GeoIP2 provider

This change introduces the GeoIP2 provider, allowing users to resolve IP addresses to geographic locations using MaxMind's GeoIP2 databases or web services. The provider supports both local database readers (such as GeoLite2) and the paid Precision Web Service API, enabling lookups for country, city, subdivisions, and timezone data. It is designed to work with PHP Geocoder 5 and requires PHP 7.2 or higher.

src/Provider/GeoIP2 · high confidence

Initial release of the Here geocoder provider

This change introduces the new Here provider, enabling users to perform geocoding and reverse geocoding using the Here platform. The provider supports both the legacy App ID/App Code authentication and the newer API Key authentication method (via \createUsingApiKey\). It also includes support for the Customer Integration Testing (CIT) environment, allows specifying a preferred language for results, and exposes additional data parameters such as crossing streets and routing information.

src/Provider/Here, src/Provider/IpInfoDb · high confidence

Initial release of the MaxMind Binary provider

The MaxMind Binary provider is now available as a standalone package, allowing users to perform IP geocoding using the MaxMind binary database format via the PHP GeoIP extension. This provider supports forward geocoding for IPv4 addresses but does not support IPv6 or reverse geocoding. It requires the MaxMind dat file to be provided at instantiation and handles character encoding for country and city names.

src/Provider/MaxMindBinary · high confidence

Initial release of the common-http package

A new package, common-http, has been added to provide common classes for HTTP-based geocoders. It includes an AbstractHttpProvider and relies on HTTPlug and PSR-7 libraries. The package is licensed under MIT and includes standard configuration files for testing and repository management.

src/Http · high confidence

Initial release of the standalone Geonames provider

The Geonames provider is now available as a separate package, allowing users to install it independently via \composer require geocoder-php/geonames-provider\. This release introduces the core provider implementation, including support for geocoding, reverse geocoding, and a new CountryInfo endpoint. It requires a PSR-18 HTTP client and PHP 7.2 or higher, with specific support for PHP 8.0 and 8.1 added in subsequent minor versions.

src/Provider/Geonames · high confidence

Introduce Azure Maps geocoder provider

Adds a new Azure Maps provider to the Geocoder library, enabling users to perform forward and reverse geocoding against the Azure Maps API. The implementation requires a PSR-18 HTTP client and a subscription key, and supports configuration options such as language, limit, and country set.

src/Provider/AzureMaps · high confidence

Introduce Google Maps Places provider

Adds a new Google Maps Places provider that enables geocoding and reverse geocoding via the Google Places API. Users can perform text-based geocoding in 'find' (default) or 'search' modes, and reverse geocoding using 'search' or 'nearby' modes, with support for filtering by location, radius, type, and other place-specific parameters.

src/Provider/GoogleMapsPlaces · high confidence

Introduce PSR-16 Cache Provider for Geocoder

A new \ProviderCache\ class has been added to wrap existing geocoder providers with a PSR-16 compatible cache. This allows users to cache geocoding and reverse-geocoding results to reduce API calls, with support for setting a custom cache lifetime and an option to separate cache keys by provider name. The provider is implemented as a non-final class, allowing for subclassing and overriding of the cache key generation logic.

src/Provider/Cache · high confidence

Introduce Photon geocoding provider

Adds the Photon provider, enabling geocoding and reverse geocoding via the Photon API (photon.komoot.io). The provider supports query parameters for latitude/longitude, bounding box, layer filtering, and OpenStreetMap tag filters, and returns address details including state, county, district, and OSM metadata.

src/Provider/Photon · high confidence

Introduce Plugin middleware architecture for Geocoder providers

This change adds a new plugin system to the Geocoder library, allowing users to wrap existing providers with middleware that can transform queries, modify results, or restart requests. The core \PluginProvider\ class manages a chain of \Plugin\ implementations, enforcing a configurable limit on request restarts to prevent infinite loops (defaulting to 10). A new \LoopException\ is introduced to handle cases where this limit is exceeded, providing the original query context for debugging. This enables features like caching, rate limiting, or logging to be applied transparently to any provider.

src/Plugin · high confidence

Introduce new Dumper component for serializing geolocation data

This change introduces the \src/Common/Dumper\ component, providing a set of classes to serialize \Geocoder\\Location\ objects into various formats. It defines a \Dumper\ interface and abstract base classes (\AbstractDumper\, \AbstractArrayDumper\) to standardize the implementation. Concrete dumpers are added for GeoJSON, GPX, KML, WKT, WKB, and raw array output, allowing users to convert geocoding results into standard geospatial formats or structured data.

src/Common/Dumper · high confidence

New Address model and builder components

The \src/Common/Model\ directory now includes a new \Address\ class that implements the \Location\ interface, featuring a constructor that requires a \providedBy\ identifier and an \AdminLevelCollection\, along with getters for coordinates, bounds, street details, locality, postal code, sub-locality, country, and timezone. A corresponding \AddressBuilder\ class has been added to facilitate the construction of \Address\ instances via a fluent API, handling the creation of \Country\ and \AdminLevelCollection\ objects. Supporting model classes \Coordinates\, \Bounds\, \Country\, \AdminLevel\, and \AdminLevelCollection\ are also introduced to represent geographic data structures, with \AdminLevelCollection\ enforcing a maximum depth of 5 administrative levels and preventing duplicate level definitions.

src/Common/Model · high confidence

New Pelias geocoder provider

Added a new Pelias provider that enables geocoding and reverse geocoding against a Pelias API instance. The provider accepts a PSR-18 HTTP client and the API root URL, supports query parameters for layers and country boundaries, and returns detailed address results including id, layer, source, name, confidence, and accuracy fields via the new PeliasAddress model.

src/Provider/Pelias · high confidence

New StringFormatter for address template rendering

A new StringFormatter class has been added to the Geocoder package, allowing users to transform Location objects into formatted strings using a template-based approach. The formatter supports placeholders for street number, street name, locality, postal code, sub-locality, country, country code, timezone, and administrative levels. It handles null values gracefully and ensures country codes are uppercase, providing a consistent way to generate human-readable addresses from geocoding results.

src/Common/Formatter · high confidence

New model classes for Google Places API data

Added new model classes (GooglePlace, OpeningHours, Photo, PlusCode) to represent structured data from the Google Places API, enabling access to place details such as opening hours, photos, and Plus Codes.

src/Provider/GoogleMapsPlaces/Model · high confidence

New plugin system with Bounds, Cache, Limit, Locale, Logger, and QueryData plugins

This location introduces a new extensible plugin architecture for the Geocoder library, replacing the previous provider-centric design with a chainable middleware pattern. The diff adds six new plugin classes: BoundsPlugin (adds geographic bounds to queries), CachePlugin (caches query results with configurable lifetime and precision), LimitPlugin (enforces result limits), LocalePlugin (sets query locale), LoggerPlugin (logs query duration and results/failures), and QueryDataPlugin (injects arbitrary data into queries). These plugins allow users to compose geocoding behavior by wrapping providers, enabling features like caching, logging, and query modification without modifying individual provider implementations.

src/Plugin/Plugin · high confidence

Nominatim provider introduces NominatimAddress model with extended location details

The Nominatim provider now exposes a dedicated NominatimAddress model that extends the base Address class, providing access to additional OpenStreetMap-specific data. Users can now retrieve the OSM type and ID, the display name, category, attribution, and specific administrative subdivisions such as neighbourhoods and quarters. The model also supports arbitrary extra tags via a tags property and includes deprecated aliases for backward compatibility with older class/category getters.

src/Provider/Nominatim/Model · high confidence

OpenCage provider now exposes confidence and additional location annotations

The OpenCage provider now returns richer address data by introducing the OpenCageAddress model, which exposes the API's confidence score alongside MGRS, Maidenhead, geohash, and what3words annotations. Users can now access these specific fields on the returned address objects to better assess result quality or utilize alternative coordinate systems.

src/Provider/OpenCage · high confidence

Repository initialization and configuration scaffolding

The repository is initialized with essential configuration files including .editorconfig, .gitattributes, .gitignore, and .php-cs-fixer.dist.php to enforce coding standards and manage version control. A comprehensive CHANGELOG.md is added, documenting the project's history from version 1.1.0 through 5.0.0, highlighting major architectural shifts such as the migration to PSR-18, the introduction of query objects, and the removal of support for older PHP versions. The README.md is rewritten to reflect the current 4.x documentation, providing installation instructions for providers and HTTP clients, and listing available geocoding providers. Additionally, phpunit.xml.dist is updated to use the vendor autoload, configure code coverage, and define environment variables for API keys, while phpstan.neon and phpstan-baseline.neon are added to enable static analysis at Level 6.

(repo-wide) · high confidence

Yandex provider now exposes location precision, name, and kind

The Yandex provider's result model now includes three new fields—precision, name, and kind—accessible via getter and immutable builder methods. Users can now inspect the specific type of location returned (kind), its human-readable name, and the precision level of the geocoding result, providing more granular context for Yandex-based address lookups.

src/Provider/Yandex/Model · high confidence

Yandex provider released as a standalone package

The Yandex geocoder provider is now available as a separate package (geocoder-php/yandex-provider) rather than part of the main Geocoder monolith. This standalone version requires an API key for authentication, supports PHP 8.1, and has migrated from the PHP-HTTP client to a PSR-18 compatible client. It also introduces support for the Yandex 'kind' parameter in reverse geocoding results and uses a dedicated YandexAddress model for returned data.

src/Provider/MaxMind, src/Provider/Yandex · high confidence

Removals

Mapzen provider deprecated and marked as abandoned

The Mapzen geocoder provider is now deprecated and marked as abandoned because Mapzen shut down its APIs on February 1, 2018. The provider class remains in the codebase but is flagged as deprecated, and the CHANGELOG explicitly notes this as the final release (4.0.1) with support dropped for PHP versions below 7.2. Users should migrate to alternative providers listed in the main repository.

src/Provider/Mapzen · high confidence

Removed IpInfoDb and Yahoo geocoding providers

The IpInfoDbProvider and YahooProvider classes have been removed from the library. Users relying on these specific geocoding services will no longer be able to resolve addresses through them and must migrate to alternative providers supported by the package.

src/Geocoder/Provider · high confidence

Removed legacy Geocoder class and GeocoderInterface

The legacy \Geocoder\ class and the \GeocoderInterface\ have been removed from the \src/Geocoder\ directory. This eliminates the previous API that relied on mutable state (storing coordinates, city, etc. as properties) and a single-provider model, requiring users to adopt the newer provider-based architecture.

src/Geocoder · high confidence

Architecture

Geocoder interface and common classes moved to src/Common

The core Geocoder interface and supporting classes (including ProviderAggregator, StatefulGeocoder, TimedGeocoder, Location, Collection, and Assert) have been relocated from the main src/Geocoder directory to src/Common. This change establishes a shared library structure where common interfaces and utilities are separated from specific provider implementations, allowing multiple providers to depend on this common base. The Geocoder interface now extends Provider and defines standard geocoding methods, while the new Assert class provides strict validation for coordinates and values.

src/Common · high confidence

MapQuest provider is extracted into a standalone package

The MapQuest geocoding provider has been separated from the main Geocoder monorepo into its own dedicated repository (geocoder-php/mapquest-provider). This change includes the provider implementation, a dedicated CHANGELOG, and a README with usage examples, allowing users to install and maintain the MapQuest integration independently via \composer require geocoder-php/mapquest-provider\.

src/Provider/MapQuest · high confidence

Behavioural changes

ArcGISOnline provider now uses PSR-18 HTTP client

The ArcGISOnline provider has migrated from the PHP-HTTP (HTTPlug) client interface to the PSR-18 \ClientInterface\. This change updates the provider's dependency injection to accept a PSR-18 compatible HTTP client, aligning it with modern PHP HTTP standards and simplifying integration for users who already utilize PSR-18 clients.

src/Provider/ArcGISOnline · high confidence

Bing Maps provider now requires a PSR-18 HTTP client

The Bing Maps provider has migrated from the legacy PHP-HTTP client interface to the standard PSR-18 \ClientInterface\. This change updates the provider's constructor to accept a PSR-18 compliant HTTP client, ensuring compatibility with modern HTTP libraries and simplifying integration for users upgrading to PHP Geocoder 5.

src/Provider/BingMaps · high confidence

Chain provider now supports configurable log levels for geocoding errors

The Chain provider now allows users to configure the PSR-3 log levels used when logging errors from individual providers during geocoding and reverse geocoding operations. Previously, errors were logged at a fixed level; now, users can set distinct log levels for forward geocoding queries (via \setGeocodeQueryLogLevel\) and reverse geocoding queries (via \setReverseQueryLogLevel\), enabling more granular control over error reporting and log verbosity.

src/Provider/Chain · high confidence

FreeGeoIp provider now uses freegeoip.app and allows custom base URLs

The FreeGeoIp provider has migrated its default endpoint from the shut-down freegeoip.net to freegeoip.app. Additionally, the provider constructor now accepts an optional $baseUrl argument, allowing users to configure a custom endpoint (such as a self-hosted instance) instead of relying on the default hosted service.

src/Provider/FreeGeoIp · high confidence

GeoIPs provider marked as deprecated and abandoned

The GeoIPs provider is now deprecated because the GeoIPs service has shut down. Users will see deprecation notices when using the provider, and the README explicitly states that the package is abandoned, directing users to alternative IP geolocation providers.

src/Provider/GeoIPs · high confidence

GeoPlugin provider returns empty collection for unrecognized IPs

The GeoPlugin provider now returns an empty AddressCollection when the geocoding service returns a response with no location data (e.g., empty region, city, country, and zero coordinates), instead of returning a result with null fields. This change ensures that queries for unrecognized or unlocatable IP addresses yield no results, aligning with the behavior described in the 4.0.1 changelog entry for "Better check if we got a empty result."

src/Provider/GeoPlugin · high confidence

Geoip provider extracted to standalone package

The Geoip provider has been separated from the main Geocoder repository into its own standalone package. This change includes the provider implementation (Geoip.php), configuration files (.gitattributes, .gitignore, phpunit.xml.dist), and documentation (Readme.md, CHANGELOG.md, LICENSE). The provider relies on the deprecated PHP GeoIP extension and only supports IPv4 addresses for geocoding queries; reverse geocoding is not supported. Users should note that this provider is deprecated in favor of the Geoip2 provider.

src/Provider/Geoip · high confidence

Google Maps provider now uses PSR-18 HTTP client

The Google Maps provider has migrated from the legacy PHP-HTTP client to a PSR-18 HTTP client. This change updates the underlying HTTP adapter interface, meaning users must now provide a PSR-18 compatible HTTP client (such as \Http\\Discovery\\Psr18Client\) when instantiating the provider, rather than the previous PHP-HTTP adapter.

src/Provider/GoogleMaps · high confidence

HTTP provider now requires a PSR-18 client instead of the legacy PHP-HTTP client

The AbstractHttpProvider has been updated to depend on a PSR-18 HTTP client (Psr\\Http\\Client\\ClientInterface) rather than the older PHP-HTTP client interface. This change aligns the provider with modern HTTP standards, simplifying integration for users who already utilize PSR-18 compliant clients, while maintaining backward compatibility for factory creation via PSR-17 or the deprecated MessageFactory.

src/Http/Provider · high confidence

HostIp provider now returns empty collections for unknown or private addresses

The HostIp provider has been updated to return an empty address collection instead of a result with placeholder data when an IP address is not found or is identified as private. This change, implemented in the AbstractHostIp base class, ensures that callers receive a clean empty collection for 'Unknown City/Country' or 'Private Address' responses from the HostIp API, rather than addresses containing generic placeholder strings.

src/Provider/HostIp · high confidence

Introduce a unified exception hierarchy under the Geocoder\\Exception namespace

The library now provides a dedicated set of exception classes in the Geocoder\\Exception namespace, replacing scattered or test-based implementations. A new Exception interface extends PHP's Throwable interface, serving as the base for specific exceptions such as CollectionIsEmpty, ExtensionNotLoaded, InvalidCredentials, InvalidServerResponse, LogicException, OutOfBounds, ProviderNotRegistered, QuotaExceeded, UnsupportedOperation, and FunctionNotFound. These exceptions offer clearer error signaling for common geocoder scenarios (e.g., empty collections, missing extensions, invalid credentials, quota limits, unsupported operations, and missing functions), with some providing static factory methods for contextual messages. This change improves error handling consistency and makes it easier for users to catch and react to specific geocoder-related failures.

src/Common/Exception · high confidence

Introduce immutable Query objects with builder methods

The query layer now uses immutable value objects for geocoding requests. New classes GeocodeQuery and ReverseQuery implement the Query interface, replacing previous mutable patterns. Users can now construct queries via static create() or fromCoordinates() methods and configure them using fluent, immutable builder methods such as withText, withCoordinates, withBounds, withLocale, withLimit, and withData. Each method returns a new instance, ensuring thread safety and predictable state. The classes also implement \_\_toString for logging and unique key generation.

src/Common/Query · high confidence

Nominatim provider now uses JSON (v2) format and PSR-18 client

The Nominatim provider has been updated to communicate with the Nominatim API using the JSON (v2) response format instead of the previous XML format, and it now relies on a PSR-18 HTTP client rather than the older PHP-HTTP client. This change improves compatibility with modern PHP standards and ensures correct parsing of address details, extra tags, and query parameters like country codes and viewboxes. Users must ensure their HTTP client implementation adheres to PSR-18 and provide a User-Agent string as required by the Nominatim Usage Policy.

src/Provider/Nominatim · high confidence

PhotonAddress model exposes OSM details and administrative subdivisions

The Photon provider's address model now exposes OpenStreetMap-specific identifiers (OSM ID, type, and tag) alongside administrative subdivisions including state, county, and district. Additionally, the locality getter has been updated to fall back to the address name when the result type is 'city', ensuring more accurate city-level locality data for users.

src/Provider/Photon/Model · high confidence

Provider interface refactored to use query objects and strict typing

The provider contract has been updated to enforce strict types and a more structured API. The interface (renamed from ProviderInterface to Provider) now requires providers to implement geocodeQuery and reverseQuery methods that accept specific GeocodeQuery and ReverseQuery objects, replacing the previous getData method. Additionally, the interface and the new AbstractProvider base class include strict type declarations, and the abstract provider now provides a helper for handling localhost special cases.

src/Common/Provider · high confidence

Removed custom PSR-0 autoloader in favor of Composer

The custom PSR-0 autoloader previously defined in src/autoload.php has been removed. The application now relies on Composer for dependency management and class autoloading, simplifying the bootstrap process and aligning with modern PHP standards.

src · high confidence

TomTom provider now includes postal codes in reverse geocoding results

The TomTom provider has been updated to extract and return the postal code field when performing reverse geocoding queries. Previously, reverse lookups only returned location coordinates, street details, and country information; users can now access the postal code in the resulting address objects, aligning reverse geocoding capabilities with those of forward geocoding.

src/Provider/TomTom · high confidence

Test coverage

Add tests for the OpenRouteService provider; Added ArcGIS Online provider tests and cached responses; Added cached API responses for Google Maps provider tests; Added cached API responses for IP2Location provider tests; Added cached API responses for OpenCage geocoder tests; Added cached GeoPlugin test responses; Added test fixtures for Algolia Places provider; Added tests for AbstractHttpProvider's HTTP client getter; Added tests for Azure Maps provider; Added tests for HostIp and HostIpXml providers; Added tests for Nominatim provider features and edge cases; Added tests for Query \_\_toString serialization; Added tests for StringFormatter address formatting; Added tests for address dumper components; Added tests for the Ipstack provider; Added tests for the Mapzen geocoding provider; Added tests for the Yandex geocoder provider; Added unit and integration tests for the BingMaps provider; Added unit and integration tests for the MaxMind Binary provider; Added unit tests for Address and AddressCollection models; Added unit tests for Geocoder Plugin components; Added unit tests for ProviderAggregator and TimedGeocoder; Added unit tests for the Chain provider; Added unit tests for the ProviderCache component; Initial test suite for the Photon geocoding provider; Removed legacy Geocoder unit tests; Removed legacy test bootstrap file; Removed legacy test suite for AbstractProvider, IpInfoDb, and Yahoo providers; Updated BingMaps test fixtures to remove trailing newlines; Updated Geonames test fixtures for API response changes; Updated TomTom provider test fixtures.

Dependencies

Update provider dependencies to support willdurand/geocoder 4.0 and 5.0

All geocoder provider packages have been updated to require willdurand/geocoder ^4.0\|^5.0, ensuring compatibility with the latest major versions of the core geocoder library. Common HTTP providers also now depend on geocoder-php/common-http ^4.0, and specific providers like GeoIP2 and GeoPlugin have been updated to support geoip2/geoip2 ^2.0\|^3.0.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Baseline

  • First survey — no prior run to compare against. CAI 73.

Lenses

  • Code Health 94
  • Architecture 99
  • Maturity 59
  • Readiness 88
  • Security 81

Changes since last survey

  • 300 commits — 260 feature/other, 40 fixes

By area

  • src/Provider — 213 commits
  • (root) — 34 commits
  • .github/workflows — 22 commits
  • src/Common — 16 commits
  • src/Plugin — 6 commits
  • src/Http — 5 commits
  • .github/actions — 2 commits
  • .github/dependabot.yml — 2 commits

Notable commits

  • fix: Apply PHP CS Fixer fixes
  • fix: Apply PHPCSFixer fixes (#1275)
  • fix: Apply StyleCI fix
  • fix: Apply fixes from StyleCI (#1033)
  • fix: Apply fixes from StyleCI (#1060)
  • fix: Apply fixes from StyleCI (#1085)
  • fix: Apply fixes from StyleCI (#1097)
  • fix: Apply fixes from StyleCI (#969)
  • fix: Feature/fix php cs (#1236)
  • fix: Fix IP2Location test (#1149)
  • fix: Fix Mapbox Query build when there is Bound (#906)
  • fix: Fix Nominatim provider when "missing" osm_id and osm_type (#997)
  • fix: Fix PHPStan issues (#1208)
  • fix: Fix Reverse Geocode failure - Here maps - Undefined index: LocationId (#1190)
  • fix: Fix StyleCI (#1084)
  • fix: Fix building ProviderNotRegistered exception message (#1020)
  • fix: Fix code example (#1016)
  • fix: Fix doc (#1024)
  • fix: Fix tests IpInfo (#899)
  • fix: Revert "Revert subtree action back to checkout v3 (#1211)"
  • …and 280 more

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

geocoder-php/Geocoder was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 19 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 432f5bda7f7c41c4c421cb62adb3d0b4218da6c1 — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-13a154b7f5d1.