⭐ Found this useful? Install from Packagist · Give it a star on GitHub so more developers can find it.
Contact Form Bundle — configurable multilingual contact forms with GDPR consent, customizable fields (email, phone, text, textarea, select), optional client association, anonymous submissions, and admin CRUD. For Symfony 7.4+ and 8 · PHP 8.2+.
This bundle is FrankenPHP worker mode friendly.
- ✅ Admin CRUD for form definitions, customizable fields, and submissions
- ✅ Multilingual copy via translation entities (title, labels, GDPR text, success message)
- ✅ Customizable fields: text, email, phone, textarea, select (options per field)
- ✅ GDPR: required consent checkbox, privacy policy link, IP anonymization, retention days
- ✅ Client association: optional link to an existing host client entity or anonymous submissions
- ✅ Public form at
/contact/{slug}with PRG flow and flash success message - ✅ Override Twig templates and translations from your application
- ✅ Pluggable notifications (custom notifier, Symfony Mailer, or
ContactSubmissionCreatedEvent) - ✅ GDPR retention cleanup via
nowo:contact-form:cleanup-submissions
composer require nowo-tech/contact-form-bundleRegister in config/bundles.php if Flex recipe is not applied:
Nowo\ContactFormBundle\NowoContactFormBundle::class => ['all' => true],Import routes in config/routes.yaml:
nowo_contact_form:
resource: '@NowoContactFormBundle/Resources/config/routes.yaml'Run Doctrine migrations after mapping entities (bundle registers ORM mappings automatically).
- GitHub Actions CI requirements
- Installation
- Configuration
- Usage
- Contributing
- Code of Conduct
- Changelog
- Upgrading
- Release
- Security
- Engram
- Spec-driven development
- GitHub Spec Kit
- Demo FrankenPHP (when using the FrankenPHP demo)
- PHP 8.2+
- Symfony 7.4+ or 8.0+
- Doctrine ORM 2.17+ or 3.x
make -C demo/symfony8 upDefault URL: http://localhost:8021 (see demo .env.example for PORT).
FrankenPHP worker mode: default is FRANKENPHP_MODE=worker (see .env.example). Set classic for per-request PHP / easier hot-reload, then recreate the container (docker compose up -d). Details: docs/DEMO-FRANKENPHP.md.
make up
make test
make qa
make release-check| Language | Coverage |
|---|---|
| PHP | 99.49% line coverage (run make test-coverage to refresh) |
| TS/JS | N/A |
| Python | N/A |
MIT · Nowo.tech · Héctor Franco Aceituno
