sergeybruhin/html-sitemap

Laravel Html Sitemap Package

1.0.3 2023-11-04 17:13 UTC

This package is auto-updated.

Last update: 2024-11-04 20:09:56 UTC


README

Latest Version on Packagist Total Downloads

Basic and simple package to help you generate html sitemap inside your blade layout.

Installation

You can install the package via composer:

composer require sergeybruhin/html-sitemap

Publish Css File

php artisan vendor:publish --provider="SergeyBruhin\HtmlSitemap\Providers\HtmlSitemapServiceProvider"

Compose Sitemap in Controller

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;
    }

}

Or Compose it inside service class like this and pass resulted model to controller

<?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);
    }
}

Render Sitemap

Feel free to render sitemap in place you prefer.

 @include('html-sitemap::widget')

Widget will be rendered if variable $htmlSitemap is set.

Register route for your Controller

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');

ToDo

  • Add ability to change package widget template
  • Add ability to cache sitemap widget
  • Add ability to show sitemap as a standalone html page

Testing (Not yet 💁‍♂️)

composer test

Changelog

Please see CHANGELOG for more information what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security

If you discover any security related issues, please email sundaycreative@gmail.com instead of using the issue tracker.

Credits

License

The MIT License (MIT). Please see License File for more information.