Search by

nowo-tech / seo-kit-bundle

HecFranco

Symfony SEO kit: multilingual static routes, slug SEO layers (defaults / pages / slug patterns / specific slugs), head tags, hreflang, sitemap and robots for FrankenPHP, php-fpm and Nginx.

Package info

github.com/nowo-tech/SeoKitBundle

Documentation

Type:symfony-bundle

pkg:composer/nowo-tech/seo-kit-bundle

Statistics

Installs: 68

Dependents: 0

Suggesters: 1

Stars: 0

Open Issues: 0

v1.10.2 2026-09-27 16:25 UTC

README

CI Packagist Version Packagist Downloads License PHP Symfony Coverage

⭐ Found this useful? Give it a star on GitHub! It helps us maintain and improve the project.

Symfony SEO kit: multilingual static routes, slug SEO layers (defaults / pages / slug patterns / specific slugs), head tags, hreflang, sitemap and robots for FrankenPHP, php-fpm and Nginx.

FrankenPHP Friendly Worker Mode

This bundle is FrankenPHP worker mode friendly.

Table of contents

Features

  • ✅ Hierarchical SEO config — defaults → slug_routes → pages → slugs → attribute → runtime
  • ✅ Twig head helper — {{ nowo_seo_head() }} with Open Graph, Twitter, JSON-LD, canonical, hreflang
  • ✅ Multilingual paths — locale-specific paths and translated slugs
  • ✅ Sitemap & robots — /sitemap.xml and /robots.txt served by Symfony
  • ✅ Runtime overrides — SeoRuntime for dynamic titles from controllers
  • ✅ Host providers — defaults, indexability, and sitemap URL extension points
  • ✅ Optional Doctrine site settings — persistence.enabled + SeoSiteConfig snapshot
  • ✅ Typed JSON-LD + audit CLI — structured data nodes and nowo:seo:audit
  • ✅ Optional SEO admin + pencil API — site settings, surface overrides, FormKit forms, OriginUrlGuard
  • ✅ Surface helpers — SeoSurfaceKeys + SeoSurfaceManager for CMS/blog pencils
  • ✅ AbsoluteUrlBuilder — origin + path normalisation from base_url
  • ✅ PHP 8 attribute — #[Seo] on controllers
  • ✅ FrankenPHP-ready demo — single-container Symfony 8 demo

FrankenPHP: Demos use a single PHP service (FrankenPHP, no nginx). With APP_ENV=dev (default), the Docker entrypoint swaps in Caddyfile.dev — php_server without workers for comfortable local development. The baked-in production Caddyfile can use php_server { worker … }; see docs/DEMO-FRANKENPHP.md. Access the demo at http://localhost:PORT (see demo/README.md and .env.example).

Installation

composer require nowo-tech/seo-kit-bundle

Register the bundle in config/bundles.php (Flex does this automatically):

Nowo\SeoKitBundle\SeoKitBundle::class => ['all' => true],

Add to your base layout:

{{ nowo_seo_head() }}

Requirements

  • PHP >= 8.2, < 8.6
  • Symfony 7.4+ or 8.x (FormKit / form stack; other components still declare ^7.0 || ^8.0)
  • nowo-tech/form-kit-bundle ^2.4 (hard dependency)

Documentation

Additional documentation

Version information

Version PHP Symfony Status
1.10.x >= 8.2 7.4 – 8.1+ Stable
1.9.x >= 8.2 7.4 – 8.1+ Stable
1.8.x >= 8.2 7.0 – 8.1+ Stable
1.7.x >= 8.2 7.0 – 8.1+ Stable
1.6.x >= 8.2 7.0 – 8.1+ Stable
1.5.x >= 8.2 7.0 – 8.1+ Stable
1.4.x >= 8.2 7.0 – 8.1+ Stable
1.3.x >= 8.2 7.0 – 8.1+ Stable
1.2.x >= 8.2 7.0 – 8.1+ Stable
1.1.x >= 8.2 7.0 – 8.1+ Stable
1.0.x >= 8.2 7.0 – 8.1+ Stable

Demos

make -C demo up-symfony8   # http://localhost:8050 (default PORT)

Demo extras: locale switch, / default-locale home, SEO Admin at /admin/seo. See docs/DEMO-FRANKENPHP.md.

Tests and coverage

make test
make test-coverage
  • Tests: PHPUnit (unit)
  • PHP: 100% lines (make test-coverage)

License

MIT — see LICENSE.