13 KiB
Symfony 7.4 Upgrade Plan
Project: MyEP Next Booking Current Version: Symfony 6.4.31 Target Version: Symfony 7.4 (LTS) Date: 2026-01-09 Status: Ready for Upgrade
Executive Summary
Estimated Effort: LOW Risk Level: LOW Status: READY FOR UPGRADE
The MyEP Next Booking application is well-positioned for a Symfony 7.4 upgrade. The codebase follows modern Symfony best practices, uses PHP 8 features extensively, and avoids most deprecated patterns. All pre-upgrade fixes have been completed.
Key Facts:
- Symfony 7.4 was released on November 27, 2025
- Requires PHP 8.2.0+ (current: PHP 8.2.29)
- LTS version with bug fixes until November 2028, security fixes until November 2029
- Symfony 8.0 = Symfony 7.4 minus deprecations (same features, PHP 8.4 required)
Pre-Upgrade Status:
- PHP version: 8.2.29 (compatible)
- OAuth2 Server Bundle: 1.1.0 (compatible)
- Stimulus Bundle: 2.32.0 (compatible)
- Doctrine ORM: 3.6.0 (compatible)
- All 326 tests passing
- Email validation mode: Configured (html5)
- 18 test-only deprecation warnings (cosmetic, do not affect runtime)
Previous Plan Status
The previous upgrade plan (dated 2025-12-06) has been updated. All pre-upgrade tasks are now complete.
Completed Items
| Item | Previous Status | Current Status |
|---|---|---|
| OAuth2 Server Bundle | 1.0.0 | 1.1.0 installed |
| Stimulus Bundle | 2.31.0 | 2.32.0 installed |
| PHP 8.2 deprecations (ParticipantDto::$touched) | Planned | Completed |
| Doctrine config (controller_resolver) | Planned | Completed |
| SecurityController null safety | Needs verification | Completed (uses ?-> and ??) |
| Email validator "loose" mode deprecation | Needs fix | Completed (validator.yaml configured) |
| Failing test in BookingDataProcessorTest | Unrelated to upgrade | Resolved (test now passes) |
Current State Analysis
PHP Version Compatibility
- Current Runtime: PHP 8.2.29
- Composer Platform: PHP 8.2.28
- Symfony 7.4 Required: PHP 8.2.0+
- Status: Compatible
Installed Dependencies
Core Symfony Packages (6.4.x)
All 33 Symfony packages currently at 6.4.x need version constraint updates to 7.4.*
Third-Party Bundles - Compatible
| Package | Installed | Symfony 7.4 Compatible |
|---|---|---|
doctrine/orm |
3.6.0 | Yes |
doctrine/doctrine-bundle |
2.18.1 | Yes |
doctrine/doctrine-migrations-bundle |
3.7.0 | Yes |
league/oauth2-server-bundle |
1.1.0 | Yes |
symfony/stimulus-bundle |
2.32.0 | Yes |
symfony/webpack-encore-bundle |
2.4.0 | Yes |
symfony/monolog-bundle |
3.11.0 | Yes |
zenstruck/schedule-bundle |
1.9.0 | Yes |
league/flysystem-bundle |
3.6.1 | Yes |
league/flysystem-sftp-v3 |
3.30.0 | Yes |
nelexa/zip |
4.0.2 | Yes (verify post-upgrade) |
spatie/crypto |
2.1.1 | Yes |
Code Quality Assessment
The codebase implements modern Symfony/PHP patterns:
- All controllers use PHP 8 attributes (
#[Route]) - Constructor property promotion used throughout
- Strict types enforced on all files
- Typed properties and return type declarations
- Entities use PHP 8 attributes for ORM mapping
- Modern security system (AbstractLoginFormAuthenticator)
- No deprecated annotation usage
Pre-Upgrade Fixes - COMPLETED
1. Email Validator "loose" Mode Deprecation - DONE
Issue: The default mode for #[Assert\Email] is "loose", which is deprecated in Symfony 6.2+ and removed in Symfony 7.0.
Resolution: Framework default configured in config/packages/validator.yaml:
framework:
validation:
email_validation_mode: html5
All Email constraints in the codebase also explicitly use mode: 'strict':
src/Form/Model/ParticipantDto.php- Hasmode: 'strict'src/Form/Model/RegistrationDto.php- Hasmode: 'strict'src/BusProNet/Model/Communication.php- Hasmode: 'strict'src/Controller/ResetPasswordController.php- Hasmode: 'strict'
2. Test Deprecation Warnings - COSMETIC ONLY
Issue: 18 deprecation warnings appear during test runs.
Cause: ParticipantEditDtoTest creates a standalone validator using Validation::createValidatorBuilder() which bypasses the framework's validator.yaml configuration.
Impact: These warnings are cosmetic and do not affect:
- Runtime behavior (all Email constraints use explicit
mode: 'strict') - Symfony 7.4 compatibility (no code changes needed)
- Test results (all 326 tests pass)
Note: Warnings can be silenced with SYMFONY_DEPRECATIONS_HELPER=disabled if desired.
Required Changes
1. Update Composer Version Constraints
File: composer.json
Symfony Core Packages
Update all packages from 6.4.* to 7.4.*:
{
"require": {
"symfony/asset": "7.4.*",
"symfony/console": "7.4.*",
"symfony/doctrine-messenger": "7.4.*",
"symfony/dom-crawler": "7.4.*",
"symfony/dotenv": "7.4.*",
"symfony/expression-language": "7.4.*",
"symfony/form": "7.4.*",
"symfony/framework-bundle": "7.4.*",
"symfony/html-sanitizer": "7.4.*",
"symfony/http-client": "7.4.*",
"symfony/intl": "7.4.*",
"symfony/lock": "7.4.*",
"symfony/mailer": "7.4.*",
"symfony/mime": "7.4.*",
"symfony/notifier": "7.4.*",
"symfony/process": "7.4.*",
"symfony/property-access": "7.4.*",
"symfony/property-info": "7.4.*",
"symfony/runtime": "7.4.*",
"symfony/security-bundle": "7.4.*",
"symfony/serializer": "7.4.*",
"symfony/string": "7.4.*",
"symfony/translation": "7.4.*",
"symfony/twig-bundle": "7.4.*",
"symfony/uid": "7.4.*",
"symfony/validator": "7.4.*",
"symfony/web-link": "7.4.*",
"symfony/yaml": "7.4.*"
}
}
Development Packages
{
"require-dev": {
"symfony/browser-kit": "7.4.*",
"symfony/css-selector": "7.4.*",
"symfony/debug-bundle": "7.4.*",
"symfony/stopwatch": "7.4.*",
"symfony/web-profiler-bundle": "7.4.*"
}
}
2. Update Symfony Flex Configuration
File: composer.json
{
"extra": {
"symfony": {
"allow-contrib": true,
"require": "7.4.*",
"docker": true
}
}
}
Potential Breaking Changes
1. Symfony Core Changes (Symfony 7.0 -> 7.4)
Symfony 7.0 removed all deprecated features from 6.4. Our codebase is fully compliant:
- Native Return Types: Already implemented
- Attribute-based Configuration: Already implemented
- Security System: Modern authenticator pattern in use
- Form System: Modern approach in use
- No Annotation Usage: All using PHP 8 attributes
2. Email Validation Mode
Breaking Change: The default mode for Email constraint changes from loose to html5 in Symfony 7.0.
Status: Already handled - all constraints use explicit mode: 'strict' and framework default is set to html5.
3. Deprecation Cleanup
Deprecations accumulated in Symfony 7.1-7.4 will need review:
- Check Symfony Profiler after upgrade for any new deprecation warnings
- Review UPGRADE-7.0.md
- Review UPGRADE-7.4.md
Upgrade Procedure
Phase 1: Preparation (15 minutes)
-
Create Feature Branch
git checkout -b feature/symfony-7.4-upgrade -
Backup Current State
git tag before-symfony-7.4-upgrade
Phase 2: Dependency Updates (30 minutes - 1 hour)
-
Update composer.json
- Update all Symfony package constraints to
7.4.* - Update
extra.symfony.requireto"7.4.*"
- Update all Symfony package constraints to
-
Run Composer Update
ddev composer update -
Review Recipe Updates
ddev composer recipesReview any recipe updates from Symfony Flex and apply as needed.
-
Clear All Caches
ddev exec bin/console cache:clear ddev exec bin/console cache:warmup ddev exec "php -r 'opcache_reset();'"
Phase 3: Testing & Validation (1-2 hours)
-
Run PHPUnit Test Suite
ddev exec ./vendor/bin/phpunitCheck for:
- Test failures
- Deprecation warnings
- Fatal errors
-
Run PHP-CS-Fixer
ddev php vendor/bin/php-cs-fixer fix --dry-run --diff -
Manual Testing - Critical Paths
- User authentication (BPN API login)
- OAuth2 token generation (
/tokenendpoint) - OAuth2 authorization flow (
/authorizeendpoint) - API endpoints (all
/api/*routes) - Booking creation flow (Steps 1-4)
- Participant form rendering and submission
- Dynamic field updates (HTMX)
- Real-time pricing calculations
- Insurance selection and filtering
- Transportation service selection
- Payment method selection
- Final booking submission to BPN API
- Booking edit functionality
- PDF/XML download functionality
- User registration
- Password reset
- Personal data management
-
Check Symfony Profiler
- Review deprecation warnings (should be minimal)
- Check performance metrics
- Verify no errors in logs
-
Test Frontend Assets
npm run build- Verify Stimulus controllers load correctly
- Test HTMX interactions
- Verify Toastify notifications
- Check TailwindCSS compilation
-
Verify ZIP File Functionality
- Test any features using
nelexa/zip(package last updated 2022) - Verify document generation and downloads work correctly
- Test any features using
Phase 4: Bug Fixes (0-2 hours)
Address any issues discovered during testing:
-
Review Error Logs
ddev logs -
Fix Any Remaining Deprecations
- Use Symfony Profiler to identify deprecations
- Update code to use modern alternatives
Phase 5: Deployment (1 hour)
-
Deploy to Staging
ddev exec vendor/bin/dep deploy staging -
Staging Validation
- Full regression testing
- Performance testing
-
Production Deployment
- Schedule maintenance window
- Deploy during low-traffic period
- Monitor error logs closely
Rollback Plan
Immediate Rollback
If critical issues are discovered:
-
Git Revert
git checkout master git reset --hard before-symfony-7.4-upgrade -
Restore Dependencies
ddev composer install -
Clear Caches
ddev exec bin/console cache:clear
Production Rollback
If issues occur in production:
ddev exec vendor/bin/dep rollback production
Testing Checklist
Unit Tests
- All PHPUnit tests pass (326 tests)
- No new deprecation warnings
- Code coverage maintained
Integration Tests
- BusProNet API integration
- XML parsing and data processing
- Booking price calculations
- Insurance assignment logic
- Field handler system
Functional Tests
- User authentication flow
- OAuth2 token generation
- API endpoints respond correctly
- Booking creation (all steps)
- Form validation
- HTMX partial updates
- Dynamic field state changes
- Real-time pricing updates
- Toast notifications
Browser Testing
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Mobile browsers
Timeline Estimate
| Phase | Estimated Time | Notes |
|---|---|---|
| Phase 1: Preparation | 15 min | Branch creation |
| Phase 2: Dependency Updates | 30 min - 1 hour | composer.json updates, composer update |
| Phase 3: Testing & Validation | 1-2 hours | Automated + manual testing |
| Phase 4: Bug Fixes | 0-2 hours | Address any issues |
| Phase 5: Deployment | 1 hour | Staging deployment |
| Total | 2.5-6 hours | Average: 3.5 hours |
Future Considerations: Symfony 8.0
Symfony 8.0 was released alongside 7.4 (November 2025) with identical features but:
- Requires PHP 8.4
- No deprecation layers (all deprecated code removed)
- Shorter support window (8 months)
Recommendation: Stay on Symfony 7.4 LTS for stability. Plan PHP 8.4 upgrade separately, then consider Symfony 8.x path.
Success Criteria
- All PHPUnit tests pass (326 tests)
- No deprecation warnings in Symfony Profiler
- All critical user flows functional
- OAuth2 authentication working
- BPN API integration operational
- Booking creation flow complete
- Frontend assets compile and load
- Performance metrics comparable or better
- No errors in production logs after 24 hours
Additional Resources
Official Symfony Documentation
- Upgrade Major Version Guide
- UPGRADE-7.0.md
- UPGRADE-7.4.md
- Symfony 7.4 Release Notes
- Preparing for Symfony 7.4 and 8.0
Bundle-Specific Documentation
Document Version: 6.0 Previous Version: 5.0 (dated 2026-01-05) Last Updated: 2026-01-09 Status: Ready for Symfony 7.4 Upgrade