nowo-tech / seo-kit-bundle
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
Type:symfony-bundle
pkg:composer/nowo-tech/seo-kit-bundle
Requires
- php: >=8.2 <8.6
- symfony/config: ^7.0 || ^8.0
- symfony/dependency-injection: ^7.0 || ^8.0
- symfony/framework-bundle: ^7.0 || ^8.0
- symfony/http-foundation: ^7.0 || ^8.0
- symfony/http-kernel: ^7.0 || ^8.0
- symfony/routing: ^7.0 || ^8.0
- symfony/twig-bundle: ^7.0 || ^8.0
- symfony/yaml: ^7.0 || ^8.0
- twig/extra-bundle: ^3.12
- twig/string-extra: ^3.12
- twig/twig: ^3.8
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- nowo-tech/phpstan-frankenphp: ^1.0
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^2.0
- phpstan/phpstan-phpunit: ^2.0
- phpstan/phpstan-symfony: ^2.0
- phpunit/phpunit: ^10.0
- rector/rector: ^2.0
- symfony/browser-kit: ^7.0 || ^8.0
- symfony/phpunit-bridge: ^7.0 || ^8.0
- vincentlanglet/twig-cs-fixer: ^4.0
Suggests
- symfony/flex: For automatic recipe installation (config and bundles.php)
README
⭐ 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.
This bundle is FrankenPHP worker mode friendly.
Table of contents
- Features
- Installation
- Requirements
- Documentation
- Version information
- Demos
- Tests and coverage
- License
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.xmland/robots.txtserved by Symfony - ✅ Runtime overrides —
SeoRuntimefor dynamic titles from controllers - ✅ 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.0 || >= 8.0
Documentation
- Installation
- Configuration
- Usage
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
Additional documentation
- Demo with FrankenPHP (includes worker mode)
- Server cookbook (Nginx, php-fpm, FrankenPHP)
- GitHub Actions CI requirements
Version information
| Version | PHP | Symfony | Status |
|---|---|---|---|
| 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.
