Aller au contenu

Programmation PHP avec Symfony/Migration de Symfony 6 à 7

Un livre de Wikilivres.

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

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

annotations.yaml

[modifier | modifier le wikicode]

Remplacer les type: annotation par :

    type: attribute

Ajouter :

    handle_all_throwables: true
    annotations:
        enabled: false

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

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,
]);

Puis lancer la modification des fichiers :

 vendor/bin/rector process src

Logo

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') }}.