norsys/seo-bundle
Norsys SEO Bundle is a Symfony bundle for managing SEO settings such as titles, meta tags, canonical URLs, sitemaps, and robots.txt through configuration and Twig helpers, helping applications centralize search engine metadata and improve visibility.
norsys/seo-bundle is a Symfony bundle, not a Laravel package. There is no ServiceProvider, no vendor:publish, no artisan command, and Laravel's package discovery will not register it. If you're in a Laravel codebase, you cannot composer require this and start using it. Your realistic entry points are: (a) a Symfony app you also maintain, or (b) a bridge where a Symfony app resolves the metadata and a Laravel front end consumes it.composer require norsys/seo-bundle
Then register it in config/bundles.php:
Norsys\SeoBundle\NorsysSeoBundle::class => ['all' => true],
The last release is 2018-07-17 — check it against your symfony/framework-bundle and Twig versions before committing. Expect to need a constraint bump or a conflict block rather than a clean install.DependencyInjection/Configuration.php (the config tree), then its Twig extension and templates. The config tree is the documentation — it tells you every meta key (title, description, robots, canonical) and the defaults. The README's quick-start is secondary.config/packages/norsys_seo.yaml and render them from a single base Twig layout, so individual controllers only override what differs. That's the whole point — keep meta tags out of controllers and out of page templates.SeoManager service, a Blade component, and a canonical-URL middleware.layout.html.twig so every page inherits canonical and robots automatically.<head>. Title, description, canonical, and robots get rendered in exactly one place. If the bundle exposes Twig functions, call them there. Never scatter meta rendering across partials — duplicate tags are an SEO bug, not a cosmetic one.robots from an environment flag. Map APP_ENV (or an explicit SEO_INDEXABLE var) into the config so staging emits noindex, nofollow and production emits your intended default. This is the single most common SEO incident — a staging site leaking index, follow into Google.SeoMetadataBuilder service of your own — the same discipline you'd apply wrapping a Laravel package behind an app-level service.<x-seo-meta :meta="$meta" />
Do not attempt to boot the Symfony bundle inside Laravel.<head> has exactly one <title>, one meta description, and one canonical. Snapshot the base layout. If you bridge to Laravel, unit-test the Blade component against a fixed payload — don't try to test Symfony internals from a Laravel PHPUnit run.config/seo.php for defaults, a SeoManager singleton bound in a service provider, a <x-seo-meta> component for output, and middleware that fills the canonical from the current route. Same model, no Symfony coupling.Norsys\SeoBundle\... to config/app.php, it's wrong. No auto-discovery, no publish tags, no config:cache path for its configuration.composer why-not symfony/framework-bundle before adopting, and be prepared to pin hard.Configuration.php and the README are your entire documentation.config/packages/*.yaml must equal the bundle's getAlias() (typically norsys_seo). A typo leaves defaults unset and you get blank titles with no error. Diagnose with:
bin/console debug:config norsys_seo
bin/console debug:container | grep -i seo
bin/console debug:twig | grep -i seo
grep -R '<meta name="description"' templates/ and keep exactly one.|raw — an unescaped quote breaks the attribute and can inject markup into <head>.?page= or locale prefixes. A self-referencing canonical that points page 2+ back to page 1 de-indexes your paginated content. Override it yourself rather than accepting a wrong one.config/packages/norsys_seo.yaml, run bin/console cache:clear, and clear the prod cache on every deploy. "Config changes have no effect" is nearly always stale container cache.vendor/norsys/seo-bundle are lost on the next composer update. Use the config tree first, Symfony event listeners/decorators second, a compiler pass third — in that order.dump() inside a Twig base layout will wreck every response. Use Symfony's profiler and the bundle's logging rather than inline dumps.How can I help you explore Laravel packages today?