Programmation PHP avec Symfony/Migration de Symfony 6 à 7
La liste des dépréciations cassantes en Symfony 7 est disponible dans le Profiler d'un projet Symfony 6.4, à la section logs[1].
Il faut donc procéder aux remplacements ci-dessous avant de lancer la migration proprement dite, qui consiste à rechercher / remplacer dans composer.json, les "6.4.*" par "7.3.*", puis en lançant :
composer update "symfony/*" --with-all-dependencies
composer.json
[modifier | modifier le wikicode]Le composant suivant est abandonné depuis Symfony 6.4[2] :
composer remove symfony/proxy-manager-bridge -W
Mettre à jour symfony/webpack-encore-bundle en V2 minimum. Selon si c'est utilisé dans le code, cette migration nécessite maintenant d'ajouter :
composer require symfony/stimulus-bundle
config
[modifier | modifier le wikicode]annotations.yaml
[modifier | modifier le wikicode]Remplacer les type: annotation par :
type: attribute
framework.yml
[modifier | modifier le wikicode]Ajouter :
handle_all_throwables: true
annotations:
enabled: false
security.yaml
[modifier | modifier le wikicode]Retirer enable_authenticator_manager.
.env et doctrine.yaml
[modifier | modifier le wikicode]Dans le .env, ajouter les query params en suffixes des DSN :
?serverVersion=8.0.32&charset=utf8mb4
Et retirer ces valeurs de doctrine.yaml : server_version: '8.0.35'.
Toujours dans doctrine.yaml, si vous aviez dû ajouter la ligne suivante pour Symfony 6 :
enable_lazy_ghost_objects: true
Il faut maintenant la remplacer par :
enable_native_lazy_objects: true
Rector
[modifier | modifier le wikicode]Facultativement, on peut utiliser Rector pour convertir automatiquement vers les nouvelles syntaxes.
Installation :
composer require rector/rector --dev vendor/bin/rector init
Ensuite, il suffit de mettre les règles voulues dans rector.php. Ex :
return RectorConfig::configure()
->withPaths([
__DIR__ . '/src',
__DIR__ . '/tests',
])
->withSymfonyContainerXml(__DIR__ . '/var/cache/dev/App_KernelDevDebugContainer.xml')
->withAttributesSets(symfony: true)
->withComposerBased(symfony: true)
->withSets([
LevelSetList::UP_TO_PHP_84,
DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES,
])
->withRules([
Rector\CodeQuality\Rector\Class_\CompleteDynamicPropertiesRector::class,
Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector::class,
Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictNativeCallRector::class,
]);
Exemple avec en PHP 8.3
$rectorConfig->sets([
LevelSetList::UP_TO_PHP_83,
SymfonySetList::SYMFONY_72,
SymfonySetList::SYMFONY_CODE_QUALITY,
SymfonySetList::SYMFONY_CONSTRUCTOR_INJECTION,
SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES,
DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES,
]);
Puis lancer la modification des fichiers :
vendor/bin/rector process src
Rector est susceptible de déplacer les attributs #[Route(path: '/xxx', name: 'xxx_')] de classes dans chacune de leurs méthodes, sans ajouter en préfixes des noms de leurs routes, la valeur du paramètre "name". Ce qui plante leurs appels par nom.
Par exemple en Twig, avec {{ path('xxx_maRoute') }}.

