14 KiB
Symfony 7.4 Upgrade Plan
Project: MyEP Next Booking Current Version: Symfony 6.4.27 Target Version: Symfony 7.4 (LTS) Date: 2025-12-06 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.
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.0.0 (compatible)
- Stimulus Bundle: 2.31.0 (compatible)
- KnpMenuBundle: Removed (no longer in use)
- Doctrine ORM: 3.5.8 (compatible)
- All 281 tests passing (1 unrelated test failure to investigate)
- 18 deprecation warnings to resolve (Email validator loose mode)
Previous Plan Status
The previous upgrade plan (dated 2025-10-24) was written for Symfony 7.3. Several items have changed:
Completed Items
| Item | Previous Status | Current Status |
|---|---|---|
| OAuth2 Server Bundle | ^1.0 | 1.0.0 installed |
| Stimulus Bundle | ^2.30 | 2.31.0 installed |
| PHP 8.2 deprecations (ParticipantDto::$touched) | Planned | Completed |
| Doctrine config (controller_resolver) | Planned | Completed |
| SecurityController null safety | Planned | Needs verification |
Items No Longer Relevant
| Item | Reason |
|---|---|
| KnpMenuBundle upgrade | Bundle removed from project |
New Items Discovered
| Item | Priority | Status |
|---|---|---|
| Email validator "loose" mode deprecation | MEDIUM | Needs fix |
| Failing test in BookingDataProcessorTest | LOW | Unrelated to upgrade |
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 32 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.5.8 | Yes |
doctrine/doctrine-bundle |
2.18.1 | Yes |
doctrine/doctrine-migrations-bundle |
3.7.0 | Yes |
league/oauth2-server-bundle |
1.0.0 | Yes |
symfony/stimulus-bundle |
2.31.0 | Yes |
symfony/webpack-encore-bundle |
2.4.0 | Yes |
symfony/monolog-bundle |
3.11.0 | Yes |
zenstruck/schedule-bundle |
^1.8 | Verify during upgrade |
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 Required
1. Email Validator "loose" Mode Deprecation (MEDIUM Priority)
Issue: The default mode for #[Assert\Email] is "loose", which is deprecated in Symfony 6.2+ and removed in Symfony 7.0.
Current State: Most Email constraints already have mode: 'strict', but the framework default is still being triggered somewhere during validation.
Files to verify:
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'✓
Action: Configure framework default email validation mode in config/packages/validator.yaml:
framework:
validation:
email_validation_mode: html5
This sets the global default to html5 (recommended for Symfony 7+), eliminating deprecation warnings.
2. Test Failure Investigation (LOW Priority)
File: tests/BusProNet/DataProcessor/BookingDataProcessorTest.php:171
Issue: Expected 'Original', got 'Updated'
This appears to be a test that's failing due to recent code changes unrelated to the Symfony upgrade. Should be investigated separately but does not block the upgrade.
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/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
}
}
}
3. Configure Email Validation Mode
File: config/packages/validator.yaml
framework:
validation:
email_validation_mode: html5
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 mostly 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 using mode: 'strict' in most places. Setting global default will ensure consistency.
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: Pre-Upgrade Fixes (30 minutes)
-
Configure Email Validation Mode
# Edit config/packages/validator.yaml -
Clear Caches
ddev exec bin/console cache:clear ddev exec "php -r 'opcache_reset();'" -
Run Tests
ddev exec ./vendor/bin/phpunitVerify deprecation warnings are resolved.
Phase 2: 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 3: 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 4: 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
/opt/homebrew/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
Phase 5: 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 6: 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
- 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: Pre-Upgrade Fixes | 30 min | Email validation mode config |
| Phase 2: Preparation | 15 min | Branch creation |
| Phase 3: Dependency Updates | 30 min - 1 hour | composer.json updates, composer update |
| Phase 4: Testing & Validation | 1-2 hours | Automated + manual testing |
| Phase 5: Bug Fixes | 0-2 hours | Address any issues |
| Phase 6: Deployment | 1 hour | Staging deployment |
| Total | 3-6 hours | Average: 4 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
- 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: 4.0 Previous Version: 3.0 (Symfony 7.3 plan, dated 2025-10-24) Last Updated: 2025-12-06 Status: Ready for Symfony 7.4 Upgrade