geocoder-php/ipstack-provider
IPStack provider for the geocoder-php ecosystem. Adds an IP-to-location geocoding service backed by ipstack.com, returning geographic details for IP addresses. Use it with Geocoder’s standard interfaces to integrate IP-based lookups in PHP apps.
Installation
composer require geocoder-php/ipstack-provider
Add the provider to your config/geocoder.php:
'providers' => [
'ipstack' => [
'api_key' => env('IPSTACK_API_KEY'),
'host' => env('IPSTACK_HOST', 'http://api.ipstack.com'),
],
],
First Use Case
Fetch geocode for an IP (e.g., 1.1.1.1):
use Geocoder\Geocoder;
use Geocoder\Provider\Ipstack\IpstackProvider;
$geocoder = new Geocoder();
$geocoder->provider(IpstackProvider::class, ['api_key' => env('IPSTACK_API_KEY')]);
$result = $geocoder->geocode('1.1.1.1');
dd($result->first()->getCoordinates());
config/geocoder.php for provider-specific settings.Geocoder\Provider\Ipstack\IpstackProvider::DEBUG for API response inspection.Batch Geocoding
Use geocodeCollection() for multiple IPs:
$ips = ['1.1.1.1', '8.8.8.8'];
$results = $geocoder->geocodeCollection($ips);
Reverse Geocoding Convert coordinates to location:
$result = $geocoder->reverse('40.7128', '-74.0060');
Integration with Laravel Requests Auto-detect visitor IP:
$ip = request()->ip();
$location = $geocoder->geocode($ip)->first();
$geocoder->cache(new \Geocoder\Cache\Doctrine\DoctrineCache());
dispatch(new GeocodeIpJob($ip));
timezone, currency). Access via:
$result->first()->getData()['timezone'];
Nominatim) for redundancy:
$geocoder->provider(IpstackProvider::class)->fallback('nominatim');
API Key Leaks
IPSTACK_API_KEY in config. Use Laravel’s .env and validate:
if (empty(env('IPSTACK_API_KEY'))) {
throw new \RuntimeException('Ipstack API key not configured.');
}
config/caching to avoid repeated env checks.Rate Limits
$geocoder->provider(IpstackProvider::class)->setRetryDelay(1000); // 1s
IPv6 Support
::1 for localhost).use Geocoder\Provider\Ipstack\IpstackProvider;
$ip = IpstackProvider::normalizeIp($ip);
Data Inconsistencies
null for some fields (e.g., zip in rural areas).if (!$result->first()->getCoordinates()) {
// Fallback logic
}
Enable Debug Mode:
$geocoder->provider(IpstackProvider::class)->setDebug(true);
Logs raw API responses to storage/logs/geocoder.log.
Common Errors:
| Error | Cause | Fix |
|---|---|---|
Invalid API key |
Wrong key or expired | Regenerate key in Ipstack dashboard |
HTTP 429 Too Many Requests |
Rate limit exceeded | Cache responses or upgrade plan |
Invalid IP address |
Malformed IP | Validate with filter_var($ip, FILTER_VALIDATE_IP) |
Custom Response Mapping Override default field mappings in a service provider:
IpstackProvider::setFieldMappings([
'latitude' => 'latitude',
'longitude' => 'longitude',
'city' => 'city',
'custom_field' => 'ipstack_custom_field', // Map to non-standard field
]);
Webhook Integration Use Ipstack’s webhooks to push geocode events to your app:
Route::post('/ipstack-webhook', function (Request $request) {
// Process webhook payload
});
Testing Mock the provider in tests:
$mock = Mockery::mock(IpstackProvider::class);
$mock->shouldReceive('geocode')
->once()
->andReturn([new Address($coordinates, $data)]);
$geocoder->provider($mock);
How can I help you explore Laravel packages today?