Anthony HERVÉ

Ingénieur édudes et développement

Passer de Symfony2 à Symfony3

12/12/2016
Image actualité

Hier j'ai découvert par mégarde qu'il y avait une release Symfony 3 depuis le 30 novembre (honte sur moi...). Super nouvelle !!!

Du coup, j'ai voulu migrer un de mes projets sur Symfony 3. Mais avant toute chose, je l'ai juste passé sous Symfony 2.8 pour garder la compatibilité avec PHP 5.4.

Je vais donc vous indiquer ici les quelques pistes que j'ai suivies pour mettre à jour mon projet et ne plus avoir de deprecated calls.

Composer update

Dans un premier temps, il faut modifier le fichier composer.json avec les lignes suivantes :

 

"autoload": {
        "psr-4": {
            "": "src/"
        },
        "files": [
            "app/AppKernel.php"
        ]
    },
    "require": {
        "php": ">=5.5.9",
        "symfony/symfony": "3.0.*",
        "doctrine/orm": "^2.5",
        "doctrine/doctrine-bundle": "^1.6",
        "doctrine/doctrine-cache-bundle": "^1.2",
        "symfony/swiftmailer-bundle": "^2.3",
        "symfony/monolog-bundle": "^2.8",
        "sensio/distribution-bundle": "^5.0",
        "sensio/framework-extra-bundle": "^3.0.2",
        "incenteev/composer-parameter-handler": "^2.0",
        ...
    },
    "require-dev": {
        "sensio/generator-bundle": "~3.0",
        "symfony/phpunit-bridge": "~2.7"
        ...
    },

Ensuite, lancer la commande :

composer update

 

Fichiers à modifier

La deuxième chose à faire est de modifier les fichiers suivants (en gardant vos modifications personelles éventuelles) :

  • app/console
  • app/AppKernel.php
  • app/AppCache.php
  • app/autoload.php
  • web/app.php
  • wen/app_dev.php

Modifications de configuration

Dans les fichiers de routing, il faut remplacer :

  • pattern par path
  • _method par methods

Dans les définitions de services, quand vous souhaitez utiliser une factory, il faut remplacer :

 

factory_service: doctrine.orm.default_entity_manager
factory_method: getRepository

par

 

factory: ["@doctrine.orm.default_entity_manager", "getRepository"]

Dans votre fichier config.yml, il faut remplacer twig.form.resources par twig.from_themes.

Modifications sur les formulaires

A partir de là, mon site tournait correctement mais je voyais dans la jolie nouvelle toolbar ci-dessous qu'il y avait des appels à des fonctions deprecated sur mes pages avec formulaire. Après avoir regardé sur la documentation de Symfony et quelques recherches Google, voici les modifications que j'ai apportées pour ne plus avoir ces appels.

Modification des types de champ

Quand vous ajoutiez des champs à un formulaire, vous faisiez ça :

 

$builder
    ->add('email', 'email')
    ->add('title', 'text')
    ->add('message', 'textarea')
;

Et maintenant, il faut faire ça :

 

use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;

...

$builder
    ->add('email', EmailType::class)
    ->add('title', TextType::class)
    ->add('message', TextareaType::class)
;

Modification des noms de méthodes

Ancienne version d'un formulaire :

 

<?php

namespace AnthonyHerve\CommonBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ContactType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder
                ->add('email', 'email')
                ->add('title', 'text')
                ->add('message', 'textarea')
        ;
    }

    public function getName() {
        return 'ahe_contact';
    }

    public function getDefaultOptions(array $options)
    {
    	return array('data_class' => 'AnthonyHerve\CommonBundle\Entity\Contact');
    }

}

Nouvelle version du formulaire :

 

<?php

namespace AnthonyHerve\CommonBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ContactType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder
                ->add('email', EmailType::class)
                ->add('title', TextType::class)
                ->add('message', TextareaType::class)
        ;
    }

    public function getBlockPrefix() {
        return 'ahe_contact';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AnthonyHerve\CommonBundle\Entity\Contact',
        ));
    }

}

Type de champ EntityType

L'option choice_label remplace property.

Type de champ ChoiceType

Les clés / valeurs sont inversées dans le tableau choices. La clé est maintenant affichée à l'utilisateur, la valeur est enregistrée en base.

Pour la version 2.8, il faut ajouter l'option choices_as_values et la mettre à true. Cette option n'est plus nécessaire dans la version 3.0.

Type de champ EntityType

L'option entity_type remplace entity.

 

 

Dernière petite chose, si vous passiez des paramètres à vos formulaires en passant par le constructeur,  il faut maintenant les passer en tant qu'options ou alors définir le formulaire en tant que service.

Après ces modifications, nous n'aurez plus d'appels à des fonctions deprecated et vous pourrez ensuite passer tranquillement à la version 3.0.

 

Bonne continuation dans vos développements et joyeuses fêtes de fin d'année !

Commentaires