geocoder-php/free-geoip-provider
Free GeoIP provider for the Geocoder PHP library. Adds a FreeGeoIP/IP geolocation service to turn IP addresses into location data (country, region, city, coordinates) via a simple provider interface for easy plug-in use.
Installation
composer require geocoder-php/free-geoip-provider
Add the provider to your config/geocoder.php under providers:
'providers' => [
'free_geoip' => [
'host' => 'api.ipify.org', // Default, but can be overridden
'timeout' => 5.0,
'cache' => env('GEOCODE_CACHE', 'array'), // 'array', 'file', or 'redis'
],
],
First Use Case Resolve an IP to geolocation in a controller:
use Geocoder\Geocoder;
use Geocoder\ProviderManager;
$providerManager = new ProviderManager();
$geocoder = new Geocoder($providerManager, 'free_geoip');
$ip = request()->ip();
$geocode = $geocoder->geocode($ip);
return response()->json($geocode->first()->getCoordinates());
config/geocoder.php (Provider configuration)vendor/geocoder-php/free-geoip-provider/src/Provider.php (Core logic)Caching Strategies
'cache' => 'array',
'cache' => 'file',
'cache' => [
'driver' => 'redis',
'connection' => 'cache',
],
Tip: Cache TTL is managed by the underlying Geocoder library (default: 3600 seconds).
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 (if the provider supports it):
$reverse = $geocoder->reverse($coordinates);
Middleware Integration Attach geolocation data to requests:
namespace App\Http\Middleware;
use Closure;
use Geocoder\Geocoder;
class GeocodeMiddleware
{
protected $geocoder;
public function __construct(Geocoder $geocoder)
{
$this->geocoder = $geocoder;
}
public function handle($request, Closure $next)
{
$ip = $request->ip();
$request->merge([
'geo' => $this->geocoder->geocode($ip)->first()
]);
return $next($request);
}
}
Service Provider Binding
Bind the geocoder in AppServiceProvider for dependency injection:
public function register()
{
$this->app->singleton(Geocoder::class, function ($app) {
$providerManager = new ProviderManager();
$geocoder = new Geocoder($providerManager, 'free_geoip');
return $geocoder;
});
}
Rate Limiting
api.ipify.org) have strict rate limits (~1,000 requests/day).IPv6 Support
$geocode = $geocoder->geocode('2001:0db8:85a3::8a2e:0370:7334');
Cache Invalidation
$providerManager->getProvider('free_geoip')->clearCache();
Deprecated Endpoints
freegeoip.net) are deprecated. Always verify the host in the provider config.Time Zone Data
carbon/carbon to infer from coordinates:
use Carbon\Carbon;
$timeZone = Carbon::now()->setLatitude($lat)->setLongitude($lon)->getTimezone();
Enable Debugging
Set debug: true in config/geocoder.php to log HTTP requests:
'debug' => env('GEOCODE_DEBUG', false),
Check HTTP Status Codes Wrap geocoding in a try-catch to handle failures:
try {
$geocode = $geocoder->geocode($ip);
} catch (\Geocoder\Exception\UnsupportedOperationException $e) {
Log::error("GeoIP lookup failed: " . $e->getMessage());
}
Validate Provider Response Inspect raw responses for malformed data:
$provider = $providerManager->getProvider('free_geoip');
$rawData = $provider->getData($ip);
Custom Provider Logic Extend the provider for additional fields (e.g., ISP data):
namespace App\Providers;
use Geocoder\Provider\FreeGeoIpProvider;
class CustomFreeGeoIpProvider extends FreeGeoIpProvider
{
protected function parseResponse($data)
{
$data['isp'] = $data['isp'] ?? 'Unknown';
return parent::parseResponse($data);
}
}
Register it in config/geocoder.php:
'free_geoip' => [
'class' => App\Providers\CustomFreeGeoIpProvider::class,
// ...
],
Fallback Providers Chain providers for redundancy:
$providerManager->registerProvider('free_geoip');
$providerManager->registerProvider('ipinfodb');
$geocoder = new Geocoder($providerManager, ['free_geoip', 'ipinfodb']);
Environment-Specific Config
Use Laravel’s config/geocoder.php to switch providers by environment:
'providers' => [
'free_geoip' => [
'host' => env('GEOCODE_HOST', 'api.ipify.org'),
],
'paid_geoip' => [
'host' => env('PAID_GEOCODE_HOST', null),
'api_key' => env('PAID_GEOCODE_KEY'),
],
],
Then resolve dynamically:
$provider = env('GEOCODE_PROVIDER', 'free_geoip');
$geocoder = new Geocoder($providerManager, $provider);
How can I help you explore Laravel packages today?