Installation:
composer require toin0u/geocoder-laravel
For Laravel 5.5+, auto-discovery handles the service provider registration. For older versions, add Geocoder\Laravel\Providers\GeocoderService::class to config/app.php.
Publish Config (if customization needed):
php artisan vendor:publish --provider="Geocoder\Laravel\Providers\GeocoderService" --tag="config"
First Use Case: Geocode an address:
$addresses = app('geocoder')->geocode('Los Angeles, CA')->get();
Geocoding Addresses:
// Basic geocoding
$addresses = app('geocoder')->geocode('1600 Amphitheatre Parkway')->get();
// With locale
$addresses = app('geocoder')->locale('fr')->geocode('Paris')->get();
Reverse Geocoding:
$coordinates = [40.7128, -74.0060]; // [latitude, longitude]
$addresses = app('geocoder')->reverse($coordinates)->get();
IP Geocoding:
$addresses = app('geocoder')->geocode('8.8.8.8')->get();
Query Customization:
use Geocoder\Query\GeocodeQuery;
$query = GeocodeQuery::create('New York')
->withLocale('es')
->withOption('limit', 5);
$addresses = app('geocoder')->geocodeQuery($query)->get();
Facade Usage:
use Geocoder\Facades\Geocoder;
$addresses = Geocoder::geocode('Berlin')->get();
Dependency Injection:
use Geocoder\Laravel\ProviderAndDumperAggregator as Geocoder;
class AddressController {
public function __construct(private Geocoder $geocoder) {}
public function show() {
$this->geocoder->geocode('London')->get();
}
}
Caching:
// Disable caching for a specific query
$addresses = app('geocoder')->doNotCache()->geocode('Tokyo')->get();
// Configure cache duration in `config/geocoder.php`
'cache-duration' => 3600, // 1 hour
Provider Chaining:
// Use a specific provider
$addresses = app('geocoder')->using('google_maps')->geocode('Sydney')->get();
Testing:
use Illuminate\Support\Facades\Http;
Http::fake([
'maps.googleapis.com/*' => Http::response('{"results": [...]}', 200),
]);
Laravel 13 Cache Serialization:
cache.serializable_classes includes Geocoder model classes.'cache' => [
'auto_register_serializable_classes' => true,
]
'cache' => [
'auto_register_serializable_classes' => false,
]
HTTPS Requirement for GoogleMaps:
'adapter' => [LaravelHttpClient::class => ['options' => ['verify' => true]]],
Cache Staleness:
cache-duration: 0 in production. Use a reasonable duration (e.g., 3600 for 1 hour).php artisan cache:clear
Provider Failures:
try {
$addresses = app('geocoder')->geocode('Invalid Address')->get();
} catch (\Geocoder\Exception\UnsupportedProviderException $e) {
// Fallback logic
}
Log HTTP Requests:
config/logging.php:
'channels' => [
'stack' => [
'channels' => ['single', 'geocoder'],
],
'geocoder' => [
'driver' => 'single',
'path' => storage_path('logs/geocoder.log'),
],
],
Inspect Responses:
$response = app('geocoder')->geocode('Test')->get();
dd($response->getCollection()->first()->getData());
Provider-Specific Issues:
Custom Providers:
config/geocoder.php:
'providers' => [
Chain::class => [
GoogleMaps::class => [env('GOOGLE_MAPS_LOCALE'), env('GOOGLE_MAPS_API_KEY')],
YourCustomProvider::class => ['your_api_key'],
],
],
Custom Adapters:
'adapter' => [\Http\Client\Curl\Client::class => [null, null, [CURLOPT_PROXY => '...']]],
Custom Cache Store:
'cache' => [
'store' => 'geocode',
'duration' => 3600,
],
config/database.php and config/cache.php.Event Listeners:
Geocoder\Event\Geocoded):
use Geocoder\Event\Geocoded;
event(new Geocoded($addresses));
Batch Processing:
geocodeQuery() for bulk operations:
$queries = [
GeocodeQuery::create('Address 1'),
GeocodeQuery::create('Address 2'),
];
$results = app('geocoder')->geocodeQuery($queries)->get();
Parallel Requests:
spatie/async):
use Spatie\Async\Pool;
$pool = new Pool(5, function () {
return app('geocoder')->geocode('Address')->get();
});
$results = $pool->then(function ($result) {
return $result->getCollection();
})->wait();
Local Caching Layer:
$cacheKey = 'geocode:'.md5('Los Angeles');
$addresses = cache()->remember($cacheKey, 3600, function () {
return app('geocoder')->geocode('Los Angeles')->get();
});
How can I help you explore Laravel packages today?