Installation:
composer require egeloen/google-map-bundle
Add to config/bundles.php:
Egeloen\GoogleMapBundle\EgeloenGoogleMapBundle::class => ['all' => true],
Configuration: Publish the default config:
php bin/console egeloen:google-map:install
Update config/packages/egeloen_google_map.yaml with your Google Maps API key and other settings.
First Use Case: Render a basic map in a Twig template:
{{ render(controller('EgeloenGoogleMapBundle:Default:map', {
'mapId': 'basic-map',
'width': 800,
'height': 600,
'zoom': 12,
'center': { 'lat': 48.8584, 'lng': 2.2945 } # Paris
})) }}
Dynamic Map Rendering:
Use the map controller action to generate maps with runtime parameters:
// In a Symfony controller
return $this->render('App:map:template.html.twig', [
'map' => $this->get('egeloen_google_map.map_provider')->getMap(
'dynamic-map',
800,
600,
10,
['lat' => 51.5074, 'lng' => -0.1278] // London
)
]);
Markers and Overlays: Add markers via Twig:
{{ render(controller('EgeloenGoogleMapBundle:Default:map', {
'mapId': 'markers-map',
'markers': [
{ 'lat': 40.7128, 'lng': -74.0060, 'infobox': 'New York' },
{ 'lat': 34.0522, 'lng': -118.2437, 'infobox': 'Los Angeles' }
]
})) }}
Custom Templates:
Override the default Twig template by creating templates/EgeloenGoogleMap/Default/map.html.twig in your bundle.
API Integration:
Use the MapProvider service to generate maps programmatically:
$map = $this->get('egeloen_google_map.map_provider')
->getMap('api-map', 600, 400, 8, ['lat' => 37.7749, 'lng' => -122.4194])
->addMarker(37.7749, -122.4194, 'San Francisco');
Lazy Loading: Enable lazy loading in config to defer map initialization:
egeloen_google_map:
lazy_load: true
Laravel-Specific:
Use Symfony’s HttpFoundation components to bridge the bundle with Laravel’s routing:
use Symfony\Component\HttpFoundation\Request;
use Egeloen\GoogleMapBundle\Provider\MapProvider;
$mapProvider = app(MapProvider::class);
$map = $mapProvider->getMap('laravel-map', 800, 600, 12, ['lat' => 19.4326, 'lng' => -99.1332]);
Asset Management: Ensure Google Maps JavaScript API is loaded before the map. Use Laravel Mix or Vite to bundle:
// resources/js/app.js
import '@egeloen/googlemap-bundle/dist/egeloen-googlemap-bundle.js';
Environment-Specific Keys:
Use Laravel’s .env for API keys:
# config/packages/egeloen_google_map.yaml
api_key: '%env(GOOGLE_MAPS_API_KEY)%'
API Key Restrictions:
Google Maps API error: RefererNotAllowedMapError.CORS Issues:
*.yourdomain.com).Template Overrides:
templates directory to mirror the bundle’s structure exactly. Example:
/resources/views/vendor/EgeloenGoogleMap/Default/map.html.twig
Marker Clustering:
Lazy Loading Conflicts:
Console Errors:
F12) for errors like missing API keys or invalid coordinates.InvalidValueError: setCenter: not a LatLng or LatLngLiteral: in property lat: not a number
Configuration Validation:
egeloen_google_map.yaml using:
php bin/console debug:config egeloen_google_map
Logging:
config/packages/dev/egeloen_google_map.yaml:
debug: true
var/log/dev.log.Custom Map Types:
Extend the MapProvider to add custom map types (e.g., satellite, terrain):
// src/Service/CustomMapProvider.php
use Egeloen\GoogleMapBundle\Provider\MapProvider;
class CustomMapProvider extends MapProvider {
public function getTerrainMap($id, $width, $height, $zoom, $center) {
return $this->getMap($id, $width, $height, $zoom, $center)
->setMapType('terrain');
}
}
Event Listeners:
Subscribe to the egeloen_google_map.map.render event to modify map options:
// src/EventListener/MapListener.php
use Egeloen\GoogleMapBundle\Event\MapEvent;
class MapListener {
public function onMapRender(MapEvent $event) {
$event->getMap()->setOption('disableDefaultUI', true);
}
}
Register in services.yaml:
services:
App\EventListener\MapListener:
tags:
- { name: kernel.event_listener, event: egeloen_google_map.map.render, method: onMapRender }
Polyfills for Laravel: Create a Laravel service provider to wrap the bundle’s services:
// app/Providers/GoogleMapServiceProvider.php
use Egeloen\GoogleMapBundle\Provider\MapProvider;
class GoogleMapServiceProvider extends ServiceProvider {
public function register() {
$this->app->singleton('google-map', function ($app) {
return new MapProvider(
$app['egeloen_google_map.options'],
$app['twig']
);
});
}
}
Testing:
Mock the MapProvider in PHPUnit:
$mockMapProvider = $this->createMock(MapProvider::class);
$mockMapProvider->method('getMap')->willReturn(new Map('test-map'));
$this->app->instance(MapProvider::class, $mockMapProvider);
How can I help you explore Laravel packages today?