geocoder-php/tomtom-provider
TomTom provider for the Geocoder PHP library. Adds forward and reverse geocoding via TomTom APIs, returning standardized Geocoder results for addresses, coordinates, and place lookups. Useful for Laravel/PHP apps needing TomTom-backed location search.
Installation
composer require geocoder-php/tomtom-provider
Ensure geocoder-php/geocoder is also installed (required dependency).
Basic Usage
use Geocoder\Geocoder;
use Geocoder\Provider\TomTom\TomTomProvider;
$geocoder = new Geocoder();
$geocoder->registerProvider(new TomTomProvider('YOUR_TOMTOM_API_KEY'));
// Reverse geocoding (lat/lng → address)
$result = $geocoder->reverseQuery('52.5200', '13.4050');
// Forward geocoding (address → lat/lng)
$result = $geocoder->geocodeQuery('Berlin, Germany');
First Use Case
users.locations).Batch Processing
Use Geocoder\Provider\MultiProvider to combine TomTom with other providers (e.g., fallback to OpenStreetMap if TomTom fails):
$geocoder = new Geocoder();
$geocoder->registerProvider(new TomTomProvider('API_KEY'));
$geocoder->registerProvider(new \Geocoder\Provider\OpenStreetMap\OpenStreetMapProvider());
Caching Responses Cache results to avoid hitting TomTom’s rate limits (e.g., 25,000 requests/day for free tier):
$cache = new \Geocoder\Cache\DoctrineCache(new \Doctrine\Common\Cache\FilesystemCache('/path/to/cache'));
$geocoder = new Geocoder();
$geocoder->registerCache($cache);
Laravel Integration
Bind the geocoder to Laravel’s service container in AppServiceProvider:
public function register()
{
$this->app->singleton(Geocoder::class, function ($app) {
$geocoder = new Geocoder();
$geocoder->registerProvider(new TomTomProvider(config('services.tomtom.key')));
return $geocoder;
});
}
Use in controllers:
$address = $geocoder->geocodeQuery('1600 Amphitheatre Parkway, Mountain View');
Error Handling Wrap queries in try-catch to handle API limits/errors:
try {
$result = $geocoder->reverseQuery($lat, $lng);
} catch (\Geocoder\Exception\UnsupportedOperationException $e) {
// Fallback logic
}
API Key Management
.env or a secrets manager.Response Parsing
$result->getData(); // Raw response array
countryCode from reverse geocoding:
$address = $result->getFirstResult()->getPosition()->getCoordinates();
$metadata = $result->getFirstResult()->getData()['address'];
$country = $metadata['countryCode'] ?? null;
Timeouts and Retries
$provider = new TomTomProvider('API_KEY', [
'http_client' => new \GuzzleHttp\Client([
'timeout' => 10,
'connect_timeout' => 5,
'allow_redirects' => false,
]),
]);
Language/Locale Support
$result = $geocoder->geocodeQuery('Pizza', [
'language' => 'de_DE', // German
'countrySet' => 'DE', // Restrict to Germany
]);
Enable Debug Mode
Set GEOCODER_DEBUG=true in .env to log raw API responses:
putenv('GEOCODER_DEBUG=1');
Validate API Responses
dd($result->getData()) to inspect raw responses for unexpected formats.Common Issues
countrySet parameter.Custom Providers
Extend TomTomProvider to add TomTom-specific features not exposed by the base library:
class CustomTomTomProvider extends TomTomProvider {
public function getTrafficInfo($lat, $lng) {
$response = $this->httpClient->get(
"https://api.tomtom.com/traffic/services/4/flowSegmentData/json",
[
'query' => [
'key' => $this->apiKey,
'lat' => $lat,
'lon' => $lng,
]
]
);
return json_decode($response->getBody(), true);
}
}
Middleware for Requests
Add headers or modify requests via the http_client option:
$provider = new TomTomProvider('API_KEY', [
'http_client' => new \GuzzleHttp\Client([
'headers' => [
'User-Agent' => 'MyApp/1.0 (contact@example.com)',
],
]),
]);
Mocking for Testing
Use Geocoder\Provider\MockProvider to simulate responses in tests:
$geocoder = new Geocoder();
$geocoder->registerProvider(new \Geocoder\Provider\MockProvider([
'52.5200,13.4050' => 'Berlin, Germany',
]));
How can I help you explore Laravel packages today?