Sylius13 min

Migrer de Magento vers Sylius : retour d'experience et methodologie

Par Pierre-Arthur Demengel
SyliusMagentoMigrationE-commerceEtude de cas

Magento a domine le e-commerce open source pendant plus d'une decennie. Mais en 2026, de plus en plus de marchands cherchent une alternative. Cout de maintenance explosif, performances en berne, difficulte a recruter des developpeurs, migration forcee vers Adobe Commerce... Les raisons de quitter Magento ne manquent pas. Sylius, avec son architecture Symfony moderne, est une destination de migration de plus en plus choisie. Voici un retour d'experience complet, avec la methodologie que j'applique sur ce type de projet.

Pourquoi les marchands quittent Magento

Avant de parler migration, il faut comprendre les motivations. Sur les projets que j'ai accompagnes, les raisons reviennent systematiquement :

Le cout total de possession

Magento Open Source est "gratuit" mais son cout reel est eleve : hebergement gourmand (8 Go RAM minimum, souvent 16+), mises a jour complexes et risquees, extensions payantes pour des fonctionnalites basiques, et surtout un temps de developpement considerable pour chaque personnalisation a cause de la complexite de l'architecture.

Adobe Commerce (ex-Magento Commerce) coute entre 22 000 et 125 000 dollars par an en licence, selon le chiffre d'affaires. C'est un budget que beaucoup de PME ne peuvent plus justifier.

La dette technique

Un projet Magento de 5+ ans accumule inevitablement de la dette technique : modules tiers abandonnes, surcharges de classes core, patches de securite appliques a la hate, et une base de donnees EAV (Entity-Attribute-Value) qui grossit au point de degrader les performances.

La penurie de talents

Trouver un bon developpeur Magento en 2026 est devenu difficile et couteux. La communaute s'erode, les developpeurs migrent vers des stacks plus modernes. A l'inverse, l'ecosysteme Symfony est en pleine croissance et les developpeurs Symfony sont plus accessibles.

Magento vs Sylius : comparaison technique

CritereMagento 2Sylius
FrameworkFramework proprietaireSymfony (standard)
PHP minimumPHP 8.1PHP 8.2
Base de donneesEAV (complexe)Relationnelle classique
RAM minimum8 Go (16 recommande)2 Go (4 recommande)
TTFB moyen300-800ms80-200ms
Courbe d'apprentissageTres raideModeree (si Symfony connu)
APIREST + GraphQLAPI Platform (REST + GraphQL)
Template enginePHTML + KnockoutJSTwig + Symfony UX
ArchitectureMonolithiqueModulaire (composants)
Licence enterprise22 000-125 000 $/an5 000-15 000 euros/an (Plus)

Methodologie de migration en 6 phases

La migration d'un Magento vers Sylius n'est pas un simple portage. C'est une reconstruction maitrisee. Voici la methodologie que j'applique :

Phase 1 : Audit et specification (2-3 semaines)

  • Inventaire complet du Magento existant : modules installes, personnalisations, integrations
  • Analyse du catalogue : nombre de produits, types (simples, configurables, bundles, groupes), attributs custom
  • Cartographie des processus metier : checkout, promotions, livraison, paiement
  • Identification des fonctionnalites a conserver, a abandonner et a ameliorer
  • Plan de migration des donnees (mapping des entites)
  • Strategie de preservation SEO

Phase 2 : Mise en place Sylius (2-4 semaines)

  • Installation et configuration de base de Sylius
  • Configuration des channels, devises, langues, zones de taxe
  • Mise en place des methodes de paiement et livraison
  • Developpement des extensions de modele (attributs custom, champs specifiques)
  • Configuration du theme et integration du design

Phase 3 : Migration des donnees (3-6 semaines)

C'est la phase la plus technique. Le schema de donnees entre Magento (EAV) et Sylius (relationnel classique) est fondamentalement different. Voici les scripts de migration typiques :

// src/Command/MigrateProductsCommand.php
namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Attribute\AsCommand;

#[AsCommand(name: 'app:migrate:products')]
class MigrateProductsCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $magentoProducts = $this->magentoDb->fetchAll(
            'SELECT e.entity_id, e.sku, e.type_id,
                    v_name.value as name,
                    v_desc.value as description,
                    v_price.value as price,
                    v_status.value as status
             FROM catalog_product_entity e
             LEFT JOIN catalog_product_entity_varchar v_name
                ON e.entity_id = v_name.entity_id AND v_name.attribute_id = ?
             LEFT JOIN catalog_product_entity_text v_desc
                ON e.entity_id = v_desc.entity_id AND v_desc.attribute_id = ?
             LEFT JOIN catalog_product_entity_decimal v_price
                ON e.entity_id = v_price.entity_id AND v_price.attribute_id = ?
             LEFT JOIN catalog_product_entity_int v_status
                ON e.entity_id = v_status.entity_id AND v_status.attribute_id = ?
             WHERE e.type_id IN ("simple", "configurable")',
            [73, 75, 77, 97] // Attribute IDs Magento
        );

        $bar = new ProgressBar($output, count($magentoProducts));

        foreach ($magentoProducts as $mProduct) {
            $product = $this->createSyliusProduct($mProduct);
            $this->productRepository->add($product);
            $bar->advance();
        }

        $bar->finish();
        $output->writeln("\n" . count($magentoProducts) . ' produits migres.');

        return Command::SUCCESS;
    }

    private function createSyliusProduct(array $data): ProductInterface
    {
        $product = $this->productFactory->createNew();
        $product->setCode('MAG-' . $data['sku']);
        $product->setCurrentLocale('fr_FR');
        $product->setName($data['name'] ?? 'Sans nom');
        $product->setDescription($data['description'] ?? '');
        $product->setSlug($this->slugger->slug($data['name']));

        // Creer le variant par defaut
        $variant = $this->variantFactory->createNew();
        $variant->setCode($data['sku']);
        $variant->setOnHand((int) $data['qty'] ?? 0);

        $channelPricing = new ChannelPricing();
        $channelPricing->setChannelCode('default');
        $channelPricing->setPrice((int) ($data['price'] * 100));
        $variant->addChannelPricing($channelPricing);

        $product->addVariant($variant);

        return $product;
    }
}

Migration des categories

// Les categories Magento (catalog_category_entity) deviennent des Taxons Sylius
// Respecter la hierarchie parent/enfant

#[AsCommand(name: 'app:migrate:categories')]
class MigrateCategoriesCommand extends Command
{
    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $categories = $this->magentoDb->fetchAll(
            'SELECT e.entity_id, e.parent_id, e.level, e.path,
                    v.value as name, u.value as url_key
             FROM catalog_category_entity e
             LEFT JOIN catalog_category_entity_varchar v
                ON e.entity_id = v.entity_id AND v.attribute_id = 45
             LEFT JOIN catalog_category_entity_varchar u
                ON e.entity_id = u.entity_id AND u.attribute_id = 121
             WHERE e.level >= 2
             ORDER BY e.level, e.position'
        );

        foreach ($categories as $cat) {
            $taxon = $this->taxonFactory->createNew();
            $taxon->setCode('cat-' . $cat['entity_id']);
            $taxon->setCurrentLocale('fr_FR');
            $taxon->setName($cat['name']);
            $taxon->setSlug($cat['url_key'] ?? $this->slugger->slug($cat['name']));

            if ($cat['parent_id'] > 2) {
                $parent = $this->taxonRepository->findOneByCode('cat-' . $cat['parent_id']);
                if ($parent) {
                    $taxon->setParent($parent);
                }
            }

            $this->taxonRepository->add($taxon);
        }

        return Command::SUCCESS;
    }
}

Phase 4 : Preservation SEO (en continu)

Le SEO est souvent le point le plus sous-estime d'une migration. Perdre ses positions Google peut aneantir le ROI du projet. Voici les actions indispensables :

  1. Mapping des URLs : exportez toutes les URLs du Magento existant (produits, categories, CMS pages). Mappez-les vers les nouvelles URLs Sylius. Configurez des redirections 301 pour chaque ancienne URL.
  2. Conservation des meta : migrez les titres et meta descriptions des pages les mieux positionnees sans modification.
  3. Sitemap : generez et soumettez le nouveau sitemap a Google Search Console le jour de la mise en ligne.
  4. Donnees structurees : implementez les schemas Product, BreadcrumbList et Organization (voir notre guide SEO Sylius).
# Exemple de configuration nginx pour les redirections 301
# Genere automatiquement depuis le fichier de mapping CSV

# Produits (anciens URLs Magento .html vers nouveaux slugs Sylius)
location = /ancien-produit-magento.html {
    return 301 /products/nouveau-slug-sylius;
}

# Categories
location = /ancienne-categorie.html {
    return 301 /taxons/nouvelle-categorie;
}

# Pattern generique pour les anciennes URLs Magento avec ID
location ~ ^/catalog/product/view/id/([0-9]+) {
    # Utiliser une map nginx ou un fichier de redirections
    return 301 /products/$product_map;
}

Phase 5 : Tests et recette (2-3 semaines)

  • Tests fonctionnels complets (parcours d'achat, paiement, compte client)
  • Verification des donnees migrees (echantillonnage sur 5-10% du catalogue)
  • Test de performance et comparaison avec l'ancien Magento
  • Test des redirections 301 (outils type Screaming Frog)
  • Test des emails transactionnels
  • Test mobile et multi-navigateurs

Phase 6 : Mise en ligne et suivi (1 semaine + suivi)

  • Freeze des commandes sur Magento
  • Migration des donnees delta (commandes et clients crees pendant le dev)
  • Basculement DNS
  • Monitoring intensif les 48 premieres heures
  • Suivi SEO quotidien pendant 1 mois (Google Search Console)

Pieges courants a eviter

Vouloir tout migrer a l'identique

La tentation est de reproduire le Magento existant fonctionnalite par fonctionnalite. C'est une erreur. Profitez de la migration pour simplifier : supprimez les fonctionnalites inutilisées, rationalisez le catalogue, simplifiez le checkout.

Negliger la migration des images

Magento stocke les images dans une structure complexe de dossiers. Prevoyez un script dedie pour migrer et reorganiser les images, en verifiant les dimensions et en generant les thumbnails Sylius.

Sous-estimer l'impact sur les equipes

L'equipe qui utilisait Magento quotidiennement va decouvrir une interface completement differente. Prevoyez 2 a 3 sessions de formation et une documentation des processus specifiques a votre activite.

Analyse ROI : un cas concret

Sur un projet recent de migration (catalogue de 3 200 produits, 800 commandes/mois) :

PosteMagento (annuel)Sylius (annuel)
Hebergement4 800 euros (VPS 16 Go)1 800 euros (VPS 4 Go)
Licence0 euros (Open Source)0 euros (Open Source)
Maintenance12 000 euros (mises a jour, patches)6 000 euros
Extensions3 500 euros/an (renouvellements)0 euros (dev sur mesure inclus)
Total annuel20 300 euros7 800 euros

Economie annuelle : 12 500 euros. Cout de la migration : 35 000 euros. Retour sur investissement en 2,8 ans, sans compter les gains de performance qui ameliorent le taux de conversion.

Conclusion

Migrer de Magento vers Sylius est un investissement qui se justifie pour la majorite des marchands Magento en 2026. La cle du succes est une methodologie rigoureuse, une migration de donnees soignee et une strategie SEO irreprochable. Ne cherchez pas a tout faire en une fois : lancez un MVP solide, puis iterez.

Vous envisagez de quitter Magento ? Parlons-en. Je realise des audits de faisabilite gratuits pour les projets de migration significatifs. Mon expertise Symfony et Sylius vous garantit une migration sans mauvaise surprise. Decouvrez nos services et nos tarifs de developpement.

Questions fréquentes

13 projets livrésGrand-Est & BelgiqueLighthouse >90Disponible immédiatement

Un projet en tête ?

Discutons de votre site web. Réponse garantie sous 24h.

Ou appelez directement :06 95 41 30 25

WhatsApp
Appeler