mitopp/easy-seo-bundle
A lightweight bundle for adding consistent SEO metadata to PHP applications. Manage page titles, meta descriptions, canonical URLs, and Open Graph tags with minimal setup, helping pages render search- and social-friendly previews.
First, the framework reality check. Despite the "SEO Bundle" label, this is a Symfony bundle, not a Laravel package. There is no ServiceProvider, no extra.laravel block, and no package auto-discovery. As a Laravel developer you cannot composer require mitopp/easy-seo-bundle and expect it to boot — Symfony bundles are registered in config/bundles.php via a Bundle subclass, which Laravel never reads. Plan on treating this as reference material to port, not a dependency to install.
Where to look first (5–10 minutes):
composer.json — confirm the symfony/framework-bundle and PHP version constraints. With 2 stars and 0 dependents, the version pins are the most likely blocker if you ever attempt a Symfony install.*Bundle.php) — shows what getContainerExtension() and getPath() wire up.DependencyInjection/Configuration.php + Extension.php — this is the real map of configurable options (titles, descriptions, OG tags, etc.).Twig/ extension — tells you which template helpers exist, which is what you'll mirror in Blade.First use case to validate: setting a page title, meta description, and Open Graph tags for a single controller action, then rendering them in a layout template. If the bundle can't cleanly do that in its own Symfony test app, don't invest further.
If you're actually on Symfony: register the bundle in config/bundles.php, import the bundle's config under config/packages/, inject the relevant SEO service into a controller, and call the Twig helper from your base layout.
In Symfony (native usage):
config/packages/. Most SEO bundles expose a config tree of defaults (site name, title separator, default image) plus per-page overrides.$seo->setTitle('Product: '.$product->name)
->setDescription($product->summary)
->setCanonical($router->generate('product_show', ['id' => $product->id], true));
{{ seo_title() }}, {{ seo_meta() }}), typically in <head> of base.html.twig.Porting the pattern to Laravel (the day-to-day path for you):
SeoManager singleton bound in a SeoServiceProvider — this replaces the Symfony DI service.config/seo.php with the same defaults.@seoTitle @seoDescription @seoOgImage
or a single <x-seo-meta /> component that renders the whole <head> block.View::composer that reads route defaults/actions.HasSeoMeta) or an interface on Eloquent models.public/robots.txt.Integration tips:
config/seo.php so layouts always render something valid — missing <title> is worse than a generic one.url()->current()), not per-view, to avoid drift.content="" attributes. When porting, escape with e() in Blade and strip tags from descriptions.->scalarNode()->defaultValue(...) semantics with strict merging — don't assume the YAML defaults map 1:1 to a PHP array; read Configuration.php literally.bin/console debug:container | grep seo and bin/console debug:config <bundle_alias> are your fastest checks that the extension loaded. Neither exists in Laravel — use php artisan tinker and app(SeoManager::class) instead.seo.php config, a singleton manager, a Blade component, and a sitemap route is the entire job. If you find yourself porting the bundle's DI compiler passes, stop — you've left the scope of "easy SEO."How can I help you explore Laravel packages today?