geocoder-php/google-maps-places-provider
Google Maps Places provider for the PHP Geocoder library. Lets you geocode and reverse geocode using Google Places/Maps APIs, returning structured location results for addresses and points of interest. Ideal for Laravel/PHP apps needing Places search and lookup.
Installation
composer require geocoder-php/google-maps-provider
(Note: The package is likely geocoder-php/google-maps-provider, not google-maps-places-provider—verify the correct package name in your project.)
Basic Usage
use Geocoder\Geocoder;
use Geocoder\Provider\GoogleMaps\GoogleMapsProvider;
$geocoder = new Geocoder();
$geocoder->registerProvider(new GoogleMapsProvider('YOUR_GOOGLE_API_KEY'));
// Example: Search for places
$results = $geocoder->geocodeQuery('1600 Amphitheatre Parkway, Mountain View, CA');
foreach ($results as $result) {
echo $result->getCoordinates(); // Lat/Lng
}
First Use Case
$results = $geocoder->reverseQuery(37.422, -122.084);
Place Autocomplete
Use the GoogleMapsProvider to fetch suggestions as users type:
$provider = $geocoder->provider('google_maps');
$predictions = $provider->autocomplete('San Fran');
Place Details Fetch detailed info (e.g., opening hours, photos) for a specific place ID:
$details = $provider->placeDetails('ChIJD4pP5NIi4okR5383L3FrYWw');
Nearby Search Find places within a radius:
$nearby = $provider->nearbySearch(37.422, -122.084, 'restaurant', 1000);
Integration with Laravel
AppServiceProvider:
$this->app->singleton(Geocoder::class, function () {
$geocoder = new Geocoder();
$geocoder->registerProvider(new GoogleMapsProvider(config('services.google_maps.key')));
return $geocoder;
});
config/services.php:
'google_maps' => [
'key' => env('GOOGLE_MAPS_API_KEY'),
],
Caching Responses Cache frequent queries (e.g., autocomplete) to reduce API calls:
$cacheKey = 'places_autocomplete_' . md5($query);
$predictions = Cache::remember($cacheKey, now()->addMinutes(5), function () use ($provider, $query) {
return $provider->autocomplete($query);
});
API Key Restrictions
.env:
GOOGLE_MAPS_API_KEY=your_key_here
Rate Limits
OVER_QUERY_LIMIT errors:
try {
$results = $provider->geocodeQuery($address);
} catch (\Geocoder\Exception\UnsupportedProviderException $e) {
// Fallback to another provider or retry later
}
Place ID vs. Reference
place_id (stable) with reference (temporary). Always use place_id for placeDetails().Language/Region Bias
language and region parameters to avoid unexpected results:
$provider->autocomplete('Paris', ['language' => 'en', 'region' => 'fr']);
Enable Debugging
Set the debug option to log HTTP requests:
$provider = new GoogleMapsProvider($apiKey, [
'debug' => true,
'http_client' => new \GuzzleHttp\Client(['debug' => true]),
]);
Handle Missing Data
Google’s responses may omit fields (e.g., opening_hours). Use null checks:
$hours = $details->getOpeningHours() ?? 'Not available';
Custom Providers
Extend the base GoogleMapsProvider to add domain-specific logic:
class CustomGoogleMapsProvider extends GoogleMapsProvider {
public function searchByType($type, $location) {
return $this->client->request('GET', '/maps/api/place/nearbysearch/json', [
'query' => [
'location' => $location,
'keyword' => $type,
],
]);
}
}
Event Listeners
Listen for geocoding events (e.g., Geocoder\Event\GeocodeEvent) to log or transform results:
$geocoder->addListener(function ($event) {
if ($event->getResult()->getType() === 'Feature') {
// Custom logic
}
});
Fallback Providers Register multiple providers and fall back gracefully:
$geocoder->registerProvider(new GoogleMapsProvider($apiKey));
$geocoder->registerProvider(new \Geocoder\Provider\OpenStreetMapProvider());
PlaceDetailsBatch for multiple place IDs:
$batch = new \Geocoder\Provider\GoogleMaps\PlaceDetailsBatch($provider);
$batch->addPlaceId('ChIJD4pP5NIi4okR5383L3FrYWw');
$batch->addPlaceId('ChIJD4pP5NIi4okR5383L3FrYWx');
$details = $batch->getDetails();
How can I help you explore Laravel packages today?