Installation Add the bundle via Composer (note: package is outdated; verify compatibility with Laravel 5.5+ via custom fork or wrapper):
composer require ekyna/sitemap-bundle
Register the bundle in config/app.php (Symfony-specific; for Laravel, use a service provider wrapper or manual integration).
First Use Case Generate a basic sitemap for your routes:
// In a controller or command
$sitemap = $this->get('ekyna_sitemap.sitemap_generator')->generate();
$sitemap->addUrl('http://example.com', ['priority' => 1.0, 'changefreq' => 'daily']);
$sitemap->render('xml'); // Outputs XML to response
Where to Look First
SitemapGenerator class for core logic (e.g., addUrl(), render()).DependencyInjection for service configuration (adapt for Laravel’s container).Dynamic Sitemap Generation
foreach (Route::getRoutes()->getRoutes() as $route) {
$sitemap->addUrl(url($route->uri()), [
'priority' => $route->priority ?? 0.8,
'changefreq' => 'weekly'
]);
}
Post::where('published', true)->each(function ($post) use ($sitemap) {
$sitemap->addUrl(route('post.show', $post), ['priority' => 0.9]);
});
Caching
$cachedSitemap = Cache::remember('sitemap_xml', now()->addHours(1), function () {
return $this->generateSitemap();
});
Multi-Language Support
$sitemap->addUrl(route('post.show', ['post' => $post, 'locale' => 'fr']));
Integration with Laravel
public function handle($request, Closure $next) {
if ($request->is('sitemap.xml')) {
return $this->generateSitemap();
}
return $next($request);
}
Artisan::command('sitemap:generate', function () {
$this->generateSitemap()->save(public_path('sitemap.xml'));
});
Image/Video Sitemaps
addImageUrl()):
$sitemap->addMediaUrl('http://example.com/image.jpg', [
'loc' => 'http://example.com',
'title' => 'Example Image',
'caption' => 'Description'
]);
Outdated Package
class LaravelSitemapService {
public function generate() {
$generator = new \Ekyna\SitemapBundle\SitemapGenerator();
// Adapt methods to Laravel conventions
return $generator;
}
}
XML Namespaces
$xml = $sitemap->render('xml');
$xml = str_replace('<urlset>', '<urlset xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">', $xml);
URL Normalization
$url = str_replace(['http://', 'https://'], '', $url);
$sitemap->addUrl(url($url));
Performance
sitemap1.xml, sitemap2.xml).Post::query()->chunk(1000, function ($posts) use ($sitemap) {
foreach ($posts as $post) {
$sitemap->addUrl(route('post.show', $post));
}
});
Testing
SitemapGenerator in PHPUnit:
$mockSitemap = $this->getMockBuilder(\Ekyna\SitemapBundle\SitemapGenerator::class)
->onlyMethods(['render'])
->getMock();
$mockSitemap->expects($this->once())->method('render')->willReturn('<urlset>...</urlset>');
$xml = $sitemap->render('xml');
Log::debug('Sitemap XML:', ['xml' => $xml]);
Custom URL Providers
class DynamicUrlProvider {
public function getUrls() {
return [
['url' => '/dynamic-page', 'priority' => 0.7],
// ...
];
}
}
Post-Processing
render() method to modify XML:
$xml = $sitemap->render('xml');
$xml = $this->postProcessXml($xml); // Add custom logic
Storage Backends
$sitemap->saveToStorage(new S3SitemapStorage());
How can I help you explore Laravel packages today?