geocoder-php/algolia-places-provider
Algolia Places provider for PHP Geocoder. Geocode and reverse geocode using Algolia’s Places API with optional authentication, locale-aware queries, and PSR-18 HTTP clients. Install via Composer and use with StatefulGeocoder for localized results.
Installation
composer require geocoder-php/algolia-places-provider
Ensure geocoder-php/geocoder is also installed (required dependency).
Basic Usage
use Geocoder\Geocoder;
use Geocoder\Provider\AlgoliaPlaces;
$geocoder = new Geocoder();
$geocoder->registerProvider(new AlgoliaPlaces('YOUR_ALGOLIA_APP_ID', 'YOUR_ALGOLIA_API_KEY'));
// Example: Search for places
$results = $geocoder->geocodeQuery('New York')->get();
First Use Case
$results = $geocoder->reverseGeocode('40.7128,-74.0060')->get();
Searching for Places
$results = $geocoder->geocodeQuery('coffee shops near Paris')->get();
foreach ($results as $result) {
echo $result->getCoordinates()->getLatitude() . ', ' . $result->getCoordinates()->getLongitude();
}
Filtering Results
Use Algolia’s built-in filters (e.g., aroundLatLng, aroundRadius):
$results = $geocoder->geocodeQuery('restaurants')
->withProviderOptions([
'aroundLatLng' => '48.8584,2.2945', // Paris
'aroundRadius' => '1000', // 1km radius
])
->get();
Autocomplete
$results = $geocoder->geocodeQuery('San Fran')->get();
Integration with Laravel
config/services.php:
'geocoder' => [
'providers' => [
'algolia_places' => [
'app_id' => env('ALGOLIA_APP_ID'),
'api_key' => env('ALGOLIA_API_KEY'),
],
],
],
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Geocoder::class, function () {
$geocoder = new Geocoder();
$geocoder->registerProvider(new AlgoliaPlaces(
config('services.geocoder.providers.algolia_places.app_id'),
config('services.geocoder.providers.algolia_places.api_key')
));
return $geocoder;
});
}
Batch Processing Use Laravel’s queues to handle geocoding tasks asynchronously:
// Dispatch a job
GeocodeJob::dispatch('New York');
// Job class
public function handle()
{
$results = app(Geocoder::class)->geocodeQuery($this->query)->get();
// Save results to DB
}
API Key Restrictions
Query Limits
$cacheKey = 'geocode_' . md5($query);
$results = Cache::remember($cacheKey, now()->addHours(1), function () use ($geocoder, $query) {
return $geocoder->geocodeQuery($query)->get();
});
Provider Options Overrides
aroundLatLng) may return empty results or errors.$options = [
'aroundLatLng' => '40.7128,-74.0060',
'aroundRadius' => '5000', // 5km
];
if (!filter_var($options['aroundLatLng'], FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_FRACTION)) {
throw new \InvalidArgumentException('Invalid coordinates format.');
}
Time Zone Handling
$result->getExtraProperties()['opening_hours'] ?? [];
Error Handling
try {
$results = $geocoder->geocodeQuery($query)->get();
} catch (\Geocoder\Exception\UnsupportedOperationException $e) {
Log::error('Geocoding failed: ' . $e->getMessage());
// Fallback to another provider or return cached data
}
Leverage Algolia’s Features
$results = $geocoder->geocodeQuery('nyoork')->get(); // Returns "New York"
hitsPerPage, attributesToRetrieve, etc.:
$options = [
'hitsPerPage' => 5,
'attributesToRetrieve' => ['name', 'address', 'latitude', 'longitude'],
];
Debugging
$provider = new AlgoliaPlaces($appId, $apiKey, [
'debug' => true,
]);
Performance Optimization
Extending Functionality
rating, categories). Access them via getExtraProperties():
$rating = $result->getExtraProperties()['rating'] ?? null;
$nearbyPlaces = Place::near($request->lat, $request->lng, 10)->get();
Testing
$mockProvider = $this->getMockBuilder(AlgoliaPlaces::class)
->disableOriginalConstructor()
->onlyMethods(['geocodeQuery'])
->getMock();
$mockProvider->method('geocodeQuery')
->willReturn(new Collection([new AddressMock()]));
$geocoder->registerProvider($mockProvider);
How can I help you explore Laravel packages today?