Canada · Shipped to production

A business platform moved from Symfony 3.4 to Symfony 7.

Collection Souvenir makes commemorative products for funeral homes in Canada. The public catalogue already existed. I migrated the business platform — orders, shop floor, operators — from Symfony 3.4 to Symfony 7, shipped to production.

ContextCanada
RoleLegacy migration → Symfony 7
StatusShipped · production

Legacy

Symfony 3.4

Bundle monolith (Backend / Frontend), PHP 5.5-era runtime, Doctrine 2, AppKernel. Starting point of the migration, now replaced.

Production

Symfony 7

PHP 8.3, Doctrine ORM 3, Security, Messenger, Mailer, Twig, Stimulus / Turbo. Same domain, new foundation — shipped to production.

SurfacesShop floor · clients · API
StackPHP 8.3 · Symfony 7.1 · Doctrine 3
QualityPHPStan · Rector · CI

Business problem

A critical shop-floor application is not thrown away. Symfony 3.4 is unmaintained: hiring, security, dependencies and change all get expensive. Orders, production jobs, operators, catalogue and client spaces need a current Symfony, while keeping the behaviour of the existing system.

Architecture

Legacy was split into two Symfony 3 bundles. Production keeps the same surfaces, with an Application layer (job, operator, product, order managers) over Doctrine entities, plus an API for partners. This is not greenfield: the existing schema and journeys constrained every module.

  1. LegacySymfony 3.4 · Backend / Frontend bundles · Doctrine 2 · historical PHP
  2. DomainProduction jobs · operators · catalogue · orders · funeral-home clients · reports
  3. ProductionPHP 8.3 · Symfony 7.1 · Doctrine 3 · Messenger · Mailer · monitoring
  4. UIShop-floor back-office · frontend workspace · API · Twig + Stimulus / Turbo

Strengths

Read the legacy before replacing it

Understand the bundles, shop-floor jobs and client journeys, then port them module by module — not a blind rewrite.

A generation jump, not cosmetic

From Symfony 3.4 / PHP 5.5+ to PHP 8.3 / Symfony 7 / Doctrine 3. Rector, PHPStan and PHP CS Fixer hold the line during the port.

Three surfaces, one domain

Shop floor (operators, jobs, production), client / funeral-home workspace, order API. The product stays bilingual FR/EN.

Quality built into the migration

GitHub Actions CI (PHP 8.3, PHPStan, CS-Fixer), application monitoring, Messenger and Mailer on the new stack — where 3.4 had no future.

My role

Legacy analysis, port to Symfony 7, data model, back-office, business frontend, API and quality (PHPStan, Rector, CI).

Deliverables and results

Public and verifiable

Delivered as part of my mission

  • Migration shipped: PHP 8.3, Symfony 7.1, Doctrine 3 in production.
  • CI: PHPStan and PHP CS Fixer on PHP 8.3.

Stack

Legacy

  • PHP 5.5+
  • Symfony 3.4
  • Doctrine 2
  • SF3 bundles

Production

  • PHP 8.3
  • Symfony 7.1
  • Doctrine ORM 3
  • Messenger
  • Twig
  • Stimulus
  • Turbo

Quality

  • PHPStan
  • PHP CS Fixer
  • Rector
  • PHPUnit
  • GitHub Actions

Other case studies