# Example App
# Service Provider
$ php artisan make:provider SeoServiceProvider
# Providers/SeoServiceProvider.php
 namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use romanzipp\Seo\Builders\StructBuilder;
use romanzipp\Seo\Facades\Seo;
use romanzipp\Seo\Helpers\Hook;
use romanzipp\Seo\Structs\Meta;
use romanzipp\Seo\Structs\Title;
class SeoServiceProvider extends ServiceProvider
{
    public function boot()
    {
        StructBuilder::$indent = str_repeat(' ', 4);
        // Add a getTitle method for obtaining the unmodified title
        Seo::macro('getTitle', function () {
            /** @var \romanzipp\Seo\Services\SeoService $this */
            if ( ! $title = $this->getStruct(Title::class)) {
                return null;
            }
            if ( ! $body = $title->getBody()) {
                return null;
            }
            return $body->getOriginalData();
        });    
        // Create a custom macro
        Seo::macro('customTag', function (string $value) {
            /** @var \romanzipp\Seo\Services\SeoService $this */
            return $this->add(
                Meta::make()->name('custom')->content($value)
            );
        });
        // Add a hook to ensure the site name is always appended to the title 
        Title::hook(
            Hook::make()
                ->onBody()
                ->callback(function ($body) {
                    return ($body ? $body . ' | ' : '') . 'Site-Name';
                })
        );
    }
}
# Middleware
$ php artisan make:middleware AddSeoDefaults
# Http/Middleware/AddSeoDefaults.php
 namespace App\Http\Middleware;
use Closure;
use romanzipp\Seo\Structs\Link;
use romanzipp\Seo\Structs\Meta;
use romanzipp\Seo\Structs\Meta\OpenGraph;
use romanzipp\Seo\Structs\Meta\Twitter;
use romanzipp\Seo\Structs\Script;
class AddSeoDefaults
{
    public function handle($request, Closure $next)
    {
        seo()->charset();
        seo()->viewport();
        seo()->title('Home');
        seo()->description('My Description');
        seo()->csrfToken();
        seo()->addMany([
            Meta::make()->name('copyright')->content('Roman Zipp'),
            Meta::make()->name('mobile-web-app-capable')->content('yes'),
            Meta::make()->name('theme-color')->content('#f03a17'),
            Link::make()->rel('icon')->href('/assets/images/Logo.png'),
            OpenGraph::make()->property('title')->content('Laravel'),
            OpenGraph::make()->property('site_name')->content('Laravel'),
            OpenGraph::make()->property('locale')->content('de_DE'),
            Twitter::make()->name('card')->content('summary_large_image'),
            Twitter::make()->name('site')->content('@romanzipp'),
            Twitter::make()->name('creator')->content('@romanzipp'),
            Twitter::make()->name('image')->content('/assets/images/Banner.jpg', false)
        ]);
        
        seo('body')->add(
            Script::make()->attr('src', '/js/app.js')
        );
        return $next($request);
    }
}
# Controllers
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
    public function index(Request $request)
    {
        seo()->title('All Posts');
        $posts = Post::all();
        return view('posts.index', compact('posts'));
    }
    public function show(Request $request, Post $post)
    {
        seo()->title($post->title ?: "Post No. {$post->id}");
        seo()->description($post->intro);
        seo()->image($post->thumbnail);
        return view('posts.show', compact('post'));
    }
}
# View
<!DOCTYPE html>
<html>
<head>
    {{ seo()->render() }}
</head>
<body>
    @yield('content')
    
    {{ seo('body')->render() }}
</body>
</html>