Basic and simple package to help you generate html sitemap inside your blade layout.
You can install the package via composer:
composer require sergeybruhin/html-sitemap
php artisan vendor:publish --provider="SergeyBruhin\HtmlSitemap\Providers\HtmlSitemapServiceProvider"
In controller do whatever you want just don't forget to pass $htmlSitemap to view. Cache this in a way you need.
<?php
namespace App\Http\Controllers;
use App\Models\Page;
use App\Models\Post;
use Illuminate\Contracts\View\View;
use SergeyBruhin\HtmlSitemap\Dto\HtmlSitemapCategory;
use SergeyBruhin\HtmlSitemap\HtmlSitemap;
class HtmlSitemapController
{
public function __invoke(): View
{
$htmlSitemap = new HtmlSitemap;
$htmlSitemap->addCategory($this->getPagesCategory());
$htmlSitemap->addCategory($this->getPostsCategory());
return view('your-layout-here')
->with('htmlSitemap', $htmlSitemap);
}
private function getPagesCategory(): HtmlSitemapCategory
{
$category = new HtmlSitemapCategory('Pages', route('pages'));
Page::each(function (Page $page) use ($category) {
$category->addLink($page->name, route('page', $page->slug));
});
return $category;
}
private function getPostsCategory(): HtmlSitemapCategory
{
$category = new HtmlSitemapCategory('News', route('posts'));
Post::each(function (Post $post) use ($category) {
$category->addLink($post->name, route('blog.show', $post->slug));
});
return $category;
}
}
<?php
namespace App\Services\Sitemap\Handlers;
use App\Models\Post;
use SergeyBruhin\HtmlSitemap\Dto\HtmlSitemapCategory;
use SergeyBruhin\HtmlSitemap\HtmlSitemap;
class GenerateHtmlSitemapHandler
{
public function run(): HtmlSitemap
{
$htmlSitemap = new HtmlSitemap;
$htmlSitemap->addCategory($this->getPostsCategory());
$htmlSitemap->addCategory($this->getPagesCategory());
return $htmlSitemap;
}
private function getPagesCategory(): HtmlSitemapCategory
{
$category = new HtmlSitemapCategory('Pages');
$category->addLink('Resume', route('resume'));
$category->addLink('Crypto', route('crypto'));
$category->addLink('Dashboard', route('dashboard'));
$category->addLink('Privacy Policy', route('privacy-policy'));
$category->addLink('Data Deletion Instruction', route('data-deletion-instruction'));
$category->addLink('Terms', route('terms'));
return $category;
}
private function getPostsCategory(): HtmlSitemapCategory
{
$category = new HtmlSitemapCategory('Blog', route('posts'));
Post::each(function (Post $post) use ($category) {
$category->addLink($post->title, route('posts.show', $post->slug));
});
return $category;
}
}
<?php
namespace App\Http\Controllers\Frontend;
use App\Http\Controllers\Controller;
use App\Services\Sitemap\Interfaces\SitemapServiceContract;
class HtmlSitemapController extends Controller
{
public function __invoke(SitemapServiceContract $sitemapService)
{
$htmlSitemap = $sitemapService->generateHtmlSitemap();
return view('frontend.pages.sitemap.master')
->with('htmlSitemap', $htmlSitemap);
}
}
Feel free to render sitemap in place you prefer.
@include('html-sitemap::widget')
Widget will be rendered if variable $htmlSitemap is set.
No restrictions on url or route name, do there what you want.
Route::get('sitemap', HtmlSitemapController::class)
->middleware('cache.headers:private;max_age=3600;etag')
->name('html-sitemap');
- Add ability to change package widget template
- Add ability to cache sitemap widget
- Add ability to show sitemap as a standalone html page
composer test
Please see CHANGELOG for more information what has changed recently.
Please see CONTRIBUTING for details.
If you discover any security related issues, please email [email protected] instead of using the issue tracker.
The MIT License (MIT). Please see License File for more information.