geocoder-php/geoip2-provider
GeoIP2 provider for PHP Geocoder using MaxMind GeoLite2/GeoIP2 databases or the paid Precision web service. Geocode IP addresses via a GeoIP2 adapter to return location data (city/country) from MMDB files or API.
cache() facade) to reduce API calls or database reads, and integrates with middleware (e.g., app()->ip()) for automatic geolocation..mmdb files (e.g., GeoLite2) and storing them securely (e.g., storage/app/geoip/). No runtime dependencies beyond the package.geocoder-php/geocoder, which must also be installed (composer require geocoder-php/geocoder).| Risk Area | Mitigation Strategy |
|---|---|
| Database Staleness | Local DBs require manual updates (MaxMind provides free/paid updates). Automate via cron or Laravel tasks. |
| API Costs | Monitor usage via MaxMind dashboard; implement rate-limiting or fallback to local DB for non-critical requests. |
| Accuracy Tradeoffs | Free GeoLite2 DB has lower precision than paid City/Country DBs. Document limitations in feature specs. |
| Dependency Bloat | The Geocoder library adds ~10MB to vendor dir. Justify ROI for geolocation features. |
| PHP Version Lock | Requires PHP ≥8.0 (Laravel 9+ compatible). Ensure dev/test environments match. |
| Caching Complexity | IP geolocation results are highly cacheable. Use Laravel’s cache or Redis with TTLs (e.g., 1 hour for local DB, 5 mins for API). |
geocoder-php/geocoder (core library) and geoip2/geoip2 (MaxMind PHP library)..mmdb files in storage/app/geoip/ (exclude from Git).composer require geocoder-php/geocoder geocoder-php/geoip2-provider geoip2/geoip2
storage/app/geoip/.AppServiceProvider:
use Geocoder\Geocoder;
use Geocoder\Provider\GeoIP2\GeoIP2;
use Geocoder\Provider\GeoIP2\GeoIP2Adapter;
use GeoIp2\Database\Reader;
$this->app->singleton(Geocoder::class, function ($app) {
$reader = new Reader(storage_path('app/geoip/GeoLite2.mmdb'));
$adapter = new GeoIP2Adapter($reader);
return new GeoIP2($adapter);
});
use GeoIp2\WebService\Client;
$client = new Client(env('MAXMIND_ACCOUNT_ID'), env('MAXMIND_LICENSE_KEY'));
$adapter = new GeoIP2Adapter($client);
public function handle(Request $request, Closure $next) {
$geocoder = app(Geocoder::class);
$ip = $request->ip();
$result = $geocoder->geocodeQuery($ip)->first();
$request->merge(['geo' => $result]);
return $next($request);
}
$cachedKey = "geoip:{$ip}";
return cache()->remember($cachedKey, 3600, function () use ($geocoder, $ip) {
return $geocoder->geocodeQuery($ip)->first();
});
geoip2/geoip2..mmdb format is supported. No support for legacy .dat files.geocoder-php/geocoder v5.x (this provider’s latest compatibility)..mmdb files (~5–10MB each).storage/app/geoip/ permissions)..env).How can I help you explore Laravel packages today?